java 反射和注解1-反射详解

反射和注解本就是一家人,注解离不开反射,这里先将反射的写法,本文涉到的注解暂时可以不不用理解

1,创建一个类

public class ReflexUser {
    public String name;
    private String namePrivate;
    protected String nameProtected;
    String nameDefault;

    public void setName(String name) {
        this.name = name;
        Log.e("ReflexUser", "setName: " + name);
    }

    protected String getNameProtected() {
        return nameProtected;
    }

    String getNameDefault() {
        return nameDefault;
    }

    private String getNamePrivate() {
        return namePrivate;
    }

    public String getName() {
        Log.e("ReflexUser", "getName: " + name);
        return name;
    }

}

2,执行反射相关操作

   //反射创建对象
            //反射获取class对象,相当于获取到加载到内存的ReflexUser.class
            Class classR = Class.forName("com.kx.jetpack.reflex.own.ReflexUser");
            //反射创建class实例 ,这里相当于new ReflexUser(),如果ReflexUser这个类在其它库中,无法new 可以通过这个方法创建对象
            Object o = classR.newInstance();

            //反射获取对象方法并且执行
            //根据名字获取class中的方法,这里相当于获取到ReflexUser中getName()这个方法
            Method getName = classR.getMethod("getName", null);
            //根据名字获取class中的方法,这里相当于获取到ReflexUser中setName()这个方法
            //getMethod(String name, Class... parameterTypes)有两个参数,
            //String name:class中的方法名字
            //Class... parameterTypes:可变参数,这里相当于方法中设置的参数的类型的class,如果没有就为空
            //这里的getName没有传入的null,setName有一个String类型,所以传入的为String.class
            //getMethod:只能获取到public方法的方法
            //getDeclaredField:获取所有方法
            Method setName = classR.getMethod("setName", String.class);
            //执行类的方法,相当余ReflexUser.setName方法
            setName.invoke(o, "Reflex Method");
            //执行类的方法,相当余ReflexUser.getName方法
            //Object invoke(Object obj, Object... args)
            //Object obj:传入通过反射创建的对象
            //Object... args:可变参数,传入对应方法中的值
            getName.invoke(o, null);

            //反射获取字段
            //并对字段进行操作,这里获取到ReflexUser中name字段
            //getField(String name)通过名字获取字段,只能获取到public字段
            //getDeclaredField(String name):通过名字获取字段,所有的
            //这里相当于获取到ReflexUser.name这个字段
            Field field = classR.getField("name");
            //对字段进行赋值
            //set(Object obj, Object value):Object obj:传入反射创建的对象,Object value:需要修改的值
            field.set(o, "Reflex field");
            //执行获取到的方法反射打印值是否修改成功
            getName.invoke(o, null);

打印结果如下:

你可能感兴趣的:(java,反射,注解)