10. 注解与反射
10.1 注解
- 注解(
Annotation
)也被称为元数据(Metadata
),用于修饰包、方法、属性、构造器、局部变量等数据信息。 - 注解不影响程序逻辑,但注解可以被编译或运行。
- 在
JavaSE
中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE
中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE
旧版中所遗留的繁冗代码和XML
配置等。
10.1.1 常用注解
@Override
: 限定某个函数必须重写超类的某一函数,该注解只能用于函数@Deprecated
:用于表示某个程序元素(类、函数)已过时@SuppressWarnings
:抑制编译器警告@SuppressWarnings({"all"})
10.1.2 元注解
修饰其他注解的注解,就被称为元注解。
Retention
:指定注解的作用范围(SOURCE编译时, RUNTIME运行时)Target
:指定注解可以用在哪些地方(CONSTRUCTOR构造器, FIELD成员变量,LOCAL_VARIABLE局部变量, METHOD方法, PACKAGE包, PARAMETER函数参数, TYPE类)Document
:注定注解是否出出现在javadoc中Inherited
:子类会继承父类的注解
10.2 反射
反射:动态引入类、动态调用实例的成员函数、成员变量等
作用是允许我们动态地修改代码并方便地添加到项目中,不需要像C++一样重新编译,速度也会比python纯解释型执行要快
在SpringBoot框架课里,用户写的bot运动代码并不是在项目源码中,可以通过反射机制加入到源码中和源码一起运行,此过程不需要将源码重新编译
10.2.1 常用API
(1) java.lang.Class
(2) java.lang.reflect.Method
(3) java.lang.reflect.Field
(4) java.lang.reflect.Constructor
package org.yxc;
public class Calculator {
public String name;
public Calculator() {}
public Calculator(String name) {
this.name = name;
}
public int add(int a, int b) {
return a + b;
}
}
package org.yxc;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class<?> cls = Class.forName("org.yxc.Calculator");
Object o = cls.newInstance(); //这里调用类的无参构造函数,如果没有无参构造函数会报错
Method method = cls.getMethod("add", int.class, int.class); //获取成员函数
int res = (int)method.invoke(o, 3, 4);
System.out.println(res);
Field field = cls.getField("name"); //获取成员变量,可以强行获取私有变量,但是不好
field.set(o, "My Calculator!");
System.out.println(field.get(o));
Constructor<?> constructor = cls.getConstructor(String.class);
Object new_o = constructor.newInstance("New Calculator!");
System.out.println(new_o); //类里写一个toString函数再输出
}
}
10.2.2 优缺点
优点:可以动态创建和使用对象,使用灵活
缺点:执行速度慢
著作权信息
- 作者:yxc
- 链接:https://www.acwing.com/file_system/file/content/whole/index/content/7194920/
- 来源:AcWing
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。