调用运行时类的指定属性

对于属性的调用体现在两方面 (前提是要先获取这个属性)
一方面是获取这个属性的值(体现为get)
另一方面是给这个属性赋一个值(体现为set)

public class FieldTest {

    @Test
    public void test1() throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        Class clazz = Person.class;

        //1.获取指定的属性(注意id在Person中声明的权限为public)

        //注意,此方法要求运行时类中的属性声明为public
        //因为属性一般不会声明为public,所以这种方法用的不多
        Field id = clazz.getField("id");//给的参数是属性名

        //非静态的属性要依托于对象才能设置值,所以要创建运行时类的对象
        Object obj = clazz.newInstance();
        Person p=(Person)obj;

        //设置当前属性的值

        //set(),参数1指明设置哪个对象的属性,参数2指明将此属性设置为多少
        id.set(p,1001);//表示把p对象的id设置为1001(会自动装箱)

        //获取当前某个对象的属性值,因为set的时候用的是Object,所以get的时候用的也是Object,但实际上是int
        Object o = id.get(p);

        int pId=(int)o;
        System.out.println(pId);//1001

        //如果一开始没有使用id.set(p,1001);那么输出的结果为0
        //因为clazz.newInstance();调用空参构造器,使用的是默认值,所以输出结果为0

        //age在Person中声明的为默认权限,如果把上面的程序中getField("id")改成getField("age"),运行会报异常
    }


    @Test
    public void test2() throws IllegalAccessException, InstantiationException, NoSuchFieldException {
        Class clazz = Person.class;

        //1.创建运行时类的对象
        Object obj = clazz.newInstance();
        Person p=(Person)obj;

        //2.getDeclaredField(String Filename),获取指定名字的属性,如果不存在会报异常
        //name在Person类中声明为:private String name
        Field name = clazz.getDeclaredField("name");

        //name.set(p,"Tom");

        //System.out.println(name.get(p));这么做会报非法访问异常IllegalAccessException:

        //如果在Person类中改成public String name,就能够正确执行并输出Tom,但其他权限都会报异常
        //这个时候是获取到了属性,但不能进行下面的set和get操作
        //把set和get注释掉以后,正常执行


        //解决方法如下
        //3.保证当前属性是可访问的,public的属性虽然没有必要,但用这个方法也没有影响
        name.setAccessible(true);//之后就可以进行修改了

        //4.获取或设置指定对象的属性值
        name.set(p,"Tom");

        System.out.println(name.get(p));//Tom

    }
}

如果想调用静态属性,set的第一个参数写当前运行时类.class,或者null即可,原因和调用运行时类的静态方法是一样的
如果是去get静态属性,get(null)即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值