Class.forName(全类名)
对象.getClass();
类名.class
字节码对象.getDeclaredConstructor();
字节码对象.getConstructor();
getConstructor只能获取公共构造器,getDeclaredConstructor可以获取所有构造器
字节码对象.getDeclaredConstructor(Class …args);
字节码对象.getConstructor(Class …args);
getConstructor只能获取公共构造器,getDeclaredConstructor可以获取所有构造器
构造器对象.newInstance(Object …args);
使用的是构造器对象,而不是字节码对象
会出现访问修饰符为private,访问权限不允许
解决方法:设置访问权限为true:构造器对象.setAccessible(Boolean flag)
字节码对象.getFileds() // 获取不到私有成员变量
字节码对象.getDeclaredFileds() // 可以获取到成员变量
字节码对象.getField(String name)
字节码对象.getDeclaredField(String name)
注意:上面的只是获取到成员变量,这里是给变量赋值,不一样
变量对象.set(Object obj, Object val) // 第一个参数是打算给哪个对象赋值,第二个参数是要赋的值
一个字节码类对应多个对象,所以我们需要针对某个对象进行赋值,而不是对所有对象进行赋值,这里需要写上要赋值的对象
注意:是在赋值前设置权限,不是在之后
变量对象.setAccessible(boolean flag)
变量对象.get(Object obj)
getDeclaredMethods
getMethods
getDeclaredMethod(String name, Class> ...parameterType) getMethod(String name, Class> …parameterType)
方法对象.invoke(Object obj, Object …args)
方法对象.setAccessible(boolean flag)
方法:要解析谁上面的注解,就得先拿到谁
如:获取类上的注解就得先获取到Class对象;想获取方法上的注解就得先获取到Method对象
public Annotation[] getDeclaredAnnotations() // 由于注解是Annotation的子类,所以这个返回值就是注解数组
public T getDeclaredAnnotation(Class annotationClass)
public boolean isAnnotationPresent(Class annotationClass)
注解是代码中的特殊标记,让程序根据注解来执行决定如何执行
注解定义:
public @interface TestAnno {
String value(); // 特殊属性
String str();
boolean bbb() defalut true;
}
编译后:
public interface TestAnno extends Annotation {
public abstract String value();
public abstract String str();
public abstract boolean bbb() defalut true;
}
总结:
如:
public @interface TestAnno {
String value(); // 特殊属性
String str();
boolean bbb() defalut true;
}
元注解是修饰注解的注解,用来标识当前注解的使用范围和注解存在的生命周期
元注解有两个:@Target和@Retention
@Target(ElementType.TYPE):修饰注解使用的位置,可以同时使用多个范围,是个数组
ElementType中有
@Retention(RetentionPolicy.RUNTIME):注解存在的生命周期
获取注解要通过反射
因为Class、Method、Constructor、Field都实现了AnnotatedElement接口,所以他们都有解析注解的能力
方法:要解析谁上面的注解,就得先拿到谁
如:获取类上的注解就得先获取到Class对象;想获取方法上的注解就得先获取到Method对象
Annotation[] getDeclaredAnnotations()
T getDeclaredAnnotation(Class annotationClass)
boolean isAnnotationPresent(Class annotationClass)