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

本文介绍了如何在Java中使用反射创建`ReflexUser`类的实例,包括通过`Class.forName`获取类对象、`newInstance`创建实例,以及如何通过`getMethod`和`invoke`执行公开方法,`getDeclaredField`获取和设置字段值。
摘要由CSDN通过智能技术生成

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

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);

打印结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值