获得Class类的四种方式
1.调用运行时类本身的.class属性
Class clazz = Demo.class;
2.通过运行时类的对象获取
Demo demo= new Demo();
Class clazz = demo.getClass();
3..通过Class的静态方法获取:体现反射的动态性
String className = “ com.kurt.Demo”;
Class clazz = Class.forName(className);
4.通过类加载器
String className = “com.kurt.Demo”;
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz = classLoader.loadClass(className);
注解
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Kurt {
String value() default "kurt";
}
注解的参数类型:
/*代表属性(annotation)位置
FILED用于修饰属性
TYPE 用于class
COnstructor 用于构造函数
*/
@Target(ElementType.METHOD)
/*
生效时机
class 编译时
runtime 运行时
source 源码
*/
@Retention(RUNTIME)
使用方式:
// @Kurt("kurt")
// String str;
解释器:
public static void injectKurt(Activity activity) {
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();//获取成员变量
for (Field field : fields) {
if (field.getAnnotations() != null) {
if (field.isAnnotationPresent(Kurt.class)) {
field.setAccessible(true);//允许修改反射属性
Kurt kurt = field.getAnnotation(Kurt.class);
// final String[] values = kurt.values();
try {
field.set(activity, kurt.value());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
Class 类 部分api:
getDeclaredFields();//获取所有成员变量
getFields();//获取public的成员变量
getMethod()//获取某个方法
getMethods();//获得对象所声明的公开方法
getDeclaredMethod("方法名",参数类型.class...);//获取方法对象
/*
method.setAccessible(true);取消访问检查。 是访问私有方法的关键
*/
getDeclaredAnnotations();//此方法返回直接存在于此元素上的所有注释
clazz.getConstructors();//获取所有构造函数(public)
clazz.getDeclaredConstructors();//获取所有构造函数 包括private
clazz.getDeclaredConstructor();//
clazz.getConstructor()//
int i = (Integer) method.invoke(mathDemo, 1,2);
//调用方法并返回值 参数1是 方法所在的对象,参数2是方法的参数集