反射的一些常规操作及简单的自定义注解

获得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是方法的参数集

你可能感兴趣的:(反射的一些常规操作及简单的自定义注解)