反射的学习(三)

反射实际使用

1,反射生成类实例对象

         a,生成类的实例对象有零种方式

  1. 使用Class对象的newInstance()方法来创建该对象对应类的实例。(前提是这种方式要求该Class对象一定有默认的构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例)
  2. 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对象对应类的实例。通过这种方式可以选择指定的构造器来创建实例。

          b,New 对象和反射获取对象的区别

  1. 在使用反射的时候,必须确保这个类已经加载。而使用New 的时候,这个类可以没有被加载,也可以已经被加载。
  2. New关键字可以调用任何public构造方法,而反射只能调用无参构造方法。
  3. New关键字是强类型,效率相对较高。反射是弱类型的,效率低。
  4. 反射提供了一种跟家灵活的方式创建对象,得到对象的信息。如动态代理的使用,都是基于反射的。解耦。

例如:

 

//获取Class对象==>Class.forName()

            Class<?> aClass = Class.forName("gpatmobile.tunion.com.myReflect.Person");

            //获取类实例对象的第一种方式

            Person o = (Person) aClass.newInstance();

            //获取类实例对象的第二种方式

            Constructor<?>[] constructors = aClass.getConstructors();

            for (int i = 0; i < constructors.length; i++) {

                System.out.println("构造函数:" + constructors[i]);

            }

            Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();

            Person o1 = (Person) declaredConstructor.newInstance();

            System.out.println("单个构造方法:" + aClass.getConstructor());

            Person o2 = (Person) aClass.getConstructor().newInstance();

            System.out.println("单个构造方法:" + aClass.getDeclaredConstructor(String.class, String.class));

                          Person o3 = (Person) aClass.getDeclaredConstructor(String.class, String.class).newInstance("yhl", "29");

 

2,反射调用类的方法

         a,通过Class对象的getMethods()方法或者getMethod()方法获得指定方法,返回Method数组或对象。

         b,调用Method对象中的Object invoke(Object obj ,Object …args)方法。第一个参数对应

   //获取Class对象==>Class.forName()

            Class<?> aClass = Class.forName("gpatmobile.tunion.com.myReflect.Person");

            Person o3 = (Person) aClass.getDeclaredConstructor(String.class, String.class).newInstance("yhl", "29");

            //第一种方式:调用person类中getname()

            String name = o3.getName();

            System.out.println("name==" + name);

            //第二种方式:获得与该方法对应的Method对象

            Method setAge = aClass.getDeclaredMethod("setAge", String.class);

            //设置权限

            setAge.setAccessible(true);

            //调用指定的方法并传递参数

            setAge.invoke(o3,"26");

            String age = o3.getAge();

            System.out.println("age==" + age);

调用该方法的实例对象,第二个参数对应该方法的参数。

 

注意:当通过Method的invoke()方法来调用对应的方法时,Java会要求程序必须有调用该方法的权限。如果程序确实需要调用某个对象的private方法,则可以先调用Method对象的如下方法。setAccessible(boolean flag):将Method对象的acessible设置为指定的布尔值。值为true,指示该Method在使用时应该取消Java语言的访问权限检查;值为false,则知识该Method在使用时要实施Java语言的访问权限检查。

3,反射访问成员变量值

         a,通过Class对象的getFields()方法或者getField()方法获得指定方法,返回Field数组或对象。

         b,Field提供了两组方法来读取或设置成员变量的值:getXXX(Object obj):获取obj对象的该成员变量的值。此处的XXX对应8种基本类型。如果该成员变量的类型是引用类型,则取消get后面的XXX。getXXX(Object obj):获取obj对象的该成员变量的值。此处的XXX对应8种基本类型。如果该成员变量的类型是引用类型,则取消get后面的XXX。

 

学习自博客:https://github.com/yangchong211

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在未来学习Java的规划可以包括以下几个方面: 1. 深入学习核心语言特性和基础知识:掌握Java的基本语法、面向对象编程、集合框架等核心概念和特性,确保对Java的基础知识有扎实的掌握。 2. 学习Java的高级特性和框架:深入学习Java的高级特性,如多线程、IO/NIO、反射机制等,同时掌握常用的开发框架,如Spring、Hibernate等,以提升开发效率和代码质量。 3. 掌握Java相关的工具和技术:学习并熟练使用Java开发中常用的工具和技术,如Maven、Git、Jenkins等,以及常用的测试框架和工具,如JUnit、Mockito等。 4. 深入了解Java的内部实现原理:学习Java虚拟机(JVM)的工作原理,了解垃圾回收机制、类加载机制等核心知识,以优化程序性能并解决潜在的性能问题。 5. 学习与Java相关的领域知识:根据自身兴趣和职业发展方向,选择学习与Java相关的领域知识,如大数据处理、分布式系统、云计算等,以扩展自己的技术广度和深度。 6. 实践项目和参与开源社区:通过实践项目和参与开源社区,将所学知识应用到实际场景中,并与其他开发者进行交流和学习,以提升自己的实际开发能力和解决问题的能力。 7. 持续学习和保持更新:Java是一个不断发展的编程语言,新的版本和特性不断涌现,因此要保持持续学习的态度,关注Java生态圈的最新动态,并随时更新自己的知识储备。 记住,这只是一个大致的学习规划,具体的学习安排还需要根据个人的情况和实际需求进行调整和补充。祝你在学习Java的道路上取得成功!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值