请选择 进入手机版 | 继续访问电脑版
查看: 67|回复: 0

Java反射

  [复制链接]

该用户从未签到

1

主题

1

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2019-3-7 19:35:25 | 显示全部楼层 |阅读模式
                                                                                            Java反射
一、反射是什么?
   Java Refliction in Action.通俗的说就是可以在运行过程‌中根据指定的类名获得类的信息。
二、反射的作用?
   (一) 首先了解两个概念:
        静态编译:在编译时确定类型,绑定对象,即通过。
      动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多   
    态的应用,有以降低类之间的藕合性
    (二)用途
        1、开发各种通用的框架,例如在Spring中,所有的Bean类都由SPring类管理,所以我们要
             反射Sping类.
         2、创建数据库连接,Class tc = Class.forName("com.java.dbtest.TestConnection")即为告诉JVM
             去加载这个类,加载是执行过程中动态加载的。对于我们需要更换数据库,仅仅需要改变一个参数即可
          3、反射就类似一个万能变量,他可以是类,可以是方法,也可以是属性等等(变数较多、比较重要的程序中应用)。
     (三)代码解释(套用一篇博文的一个例子:http://blog.csdn.net/justdoit_potato/article/details/51011843

  1. interface fruit{  
  2.     public abstract void eat();       //接口
  3. }  

  4. class Apple implements fruit{  
  5.     public void eat(){  
  6.         System.out.println("Apple");     //重写接口
  7.     }  
  8. }  

  9. class Orange implements fruit{  
  10.     public void eat(){  
  11.         System.out.println("Orange");  
  12.     }  
  13. }  

  14. // 构造工厂类  
  15. // 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了  
  16. class Factory{  
  17.     public static fruit getInstance(String fruitName){  
  18.         fruit f=null;                                               \\实例化接口
  19.         if("Apple".equals(fruitName)){                  
  20.             f=new Apple();                                      \\分情况输出
  21.         }  
  22.         if("Orange".equals(fruitName)){  
  23.             f=new Orange();  
  24.         }  
  25.         return f;  
  26.     }  
  27. }  
  28. class hello{  
  29.     public static void main(String[] a){  
  30.         fruit f=Factory.getInstance("Orange");       \\输出橘子的类
  31.         f.eat();  
  32.     }  
  33. }
复制代码

      在上面的工厂类中,我们可以看到是判断输出那个类的,但当重写水果接口的类越多,工厂类就越臃肿,并且,还需要修改主函数。由此,我们看一下反射类的代码。

  1. interface fruit{  
  2.     public abstract void eat();            //接口
  3. }  

  4. class Apple implements fruit{  
  5.     public void eat(){  
  6.         System.out.println("Apple");  
  7.     }  
  8. }  

  9. class Orange implements fruit{  
  10.     public void eat(){  
  11.         System.out.println("Orange");         //两个实现类
  12.     }  
  13. }  
  14. \\工厂类,方便水果接口的继续重写
  15. class Factory{  
  16.     public static fruit getInstance(String ClassName){  
  17.         fruit f=null;  
  18.         try{  
  19.             f=(fruit)Class.forName(ClassName).newInstance();     //反射类,其中"ClassName"既是上面所拥有的类的代称。
  20.         }catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.         return f;  
  24.     }  
  25. }  
  26. class hello{  
  27.     public static void main(String[] a){  
  28.         fruit f=Factory.getInstance("Reflect.Apple");          //反射的是橘子类
  29.         if(f!=null){  
  30.             f.eat();  
  31.         }  
  32.     }  
  33. }
复制代码

从这段代码可以看到我们仅仅是在主函数中更改一下调用的类名即可。
三、如何在应用
    Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如     cn.netjava.pojo.UserInfo;
         Object obj=c.newInstance();//创建对象的实例
   对象实例化之后就可以获得类方法的方法、类中的属性、构造函数的方法.

参考博文:https://www.cnblogs.com/yrstudy/p/6500982.html













回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注微信,有惊喜
关注我们,每天有惊喜,每日有活动,每日有礼品赠送,扫描左边二维码,即可关注,你还在等什么?
快速回复 返回顶部 返回列表