反射

一、什么是反射?


反射就是可以通过一个类的完整类名来动态完成该类的一系列操作,比如动态完成实例化,动态获取属性,动态获取方法,以及动态调用该类的方法。

二、每一个类或类的对象都有自己的class对象,那么这些类如何获得自己的class对象呢?

       (1)如果是一个类,可以通过.class属性拿到class对象

       (2)如果是一个类的对象,可以通过getClass()拿到class对象

       (3)如果是一个包装类,可以通过.TYPE拿到class对象

三、如何实现反射?

  1. //加载类,返回class对象   任何一个类都有自己的class对象 
  2. Class class1= Class.forName("com.chenghui.entity.Person"); 
  3. Constructor c =class1.getConstructor(String.class,int.class,int.class,String.class); 
  4. //调用有参数的构造方法 
  5. Object obj=c.newInstance("chenghui",1,1,"123123"); 
  6. //调用无参的构造方法,动态创建该类实例 
  7. //Object obj = class1.newInstance(); 
  8. //获取该类的所有共有属性 
  9. Field[]fields = class1.getFields(); 
  10. //获取该类的所有属性 
  11. Field[]declaredFields = class1.getDeclaredFields(); 
  12. //获取该类的所有方法 
  13. Method[]methods = class1.getMethods(); 
  14. for(Field field :declaredFields){ 
  15.    System.out.println(field); 
  16.    if(field.getName().equals("sex") ){ 
  17.       //是否允许为私有属性赋值 
  18.       field.setAccessible(true); 
  19.       field.set(obj,"男"); 
  20.    } 
  21. for(Method method :methods){ 
  22.    System.out.println(method); 
  23.    if(method.getName().equals("show")){ 
  24.       method.invoke(obj);//调用 
  25.    } 
        //加载类,返回class对象   任何一个类都有自己的class对象
        Class class1= Class.forName("com.chenghui.entity.Person");
        Constructor c =class1.getConstructor(String.class,int.class,int.class,String.class);
        //调用有参数的构造方法
        Object obj=c.newInstance("chenghui",1,1,"123123");
        //调用无参的构造方法,动态创建该类实例
        //Object obj = class1.newInstance();
        //获取该类的所有共有属性
        Field[]fields = class1.getFields();
        //获取该类的所有属性
        Field[]declaredFields = class1.getDeclaredFields();
        //获取该类的所有方法
        Method[]methods = class1.getMethods();
        for(Field field :declaredFields){
           System.out.println(field);
           if(field.getName().equals("sex") ){
              //是否允许为私有属性赋值
              field.setAccessible(true);
              field.set(obj,"男");
           }
        }
        for(Method method :methods){
           System.out.println(method);
           if(method.getName().equals("show")){
              method.invoke(obj);//调用
           }
        }

四、说说反射的好处?

1)反射,使程序变得非常灵活,非常强大,可以不同加载该类就可以完成实例化工作,并且提供动态调用其属性和方法的功能。

2 )缺点是 通过反射 是程序性能降低,再就是如果太多类都是用反射这使得程序变得很臃肿,不利于后期的维护。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值