注解和反射
2021-03-27
2 min read
注解
- 作用
- 不是程序本身,可以对程序作出解释
- 可以被其他程序(如:编译器等)读取
- 格式:以“@注释名”在代码中存在,还可以添加一些参数值
例:@Override、@SuppressWarnings(value="unchecked") - 自定义注解
//自定义注解
public class TestAnnotation {
//如果没有默认值,就必须给注解赋值
@MyAnnotation01(age = 1)
public void test01() {
}
}
//元注解
//@Target 用于描述注解的使用范围
@Target({ElementType.TYPE, ElementType.METHOD})
//@Retention 用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation01 {
//注解的参数:参数类型 + 参数名();
//default 默认值
String value() default "";
int age();
int id() default -1;
String[] schools() default {"哈士奇", "泰迪"};
}
反射
- 得到Class类的方法
- 直接通过一个class的静态变量class获取:
Class cls = String.class; - 如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
String s = "Hello";
Class cls = s.getClass(); - 如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
Class cls = Class.forName("java.lang.String");
- 直接通过一个class的静态变量class获取:
- 调用构造方法
getConstructor(Class...):获取某个public的Constructor
getDeclaredConstructor(Class...):获取某个private和public的Constructor
getConstructors():获取所有public的Constructor - 调用方法
Method getMethod(name, Class...):获取某个public的Method(包括父类)
Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
Method[] getMethods():获取所有public的Method(包括父类)
Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类) - 访问字段
Field getField(name):根据字段名获取某个public的field(包括父类)
Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
Field[] getFields():获取所有public的field(包括父类)
Field[] getDeclaredFields():获取当前类的所有field(不包括父类)