java 反射的应用场景

本贴最后更新于 2444 天前,其中的信息可能已经时异事殊

问题

网上很多将反射的,举 n 多例子说明反射怎么用,有啥用,能咋用。然而很搞不明白如下这样的例子有啥用?

class = Class.forName("cn.lee.demo.Person");  
//得到一系列构造函数集合  
Constructor[] constructors = class.getConstructors();  
 
person = (Person) constructors[0].newInstance();  
person.setAge( );  
person.setName("leeFeng");  
 
person = (Person) constructors[1].newInstance( ,"leeFeng");  

System.out.println("Demo  " + person.getName() + " : " + person.getAge()  
       + "  ,   " + person.getName() + " : " + person.getAge()  
       );

感觉就是吃饱了撑的。。。

使用场景

所以找了一下,终于知道实际的使用场景了。。出自这里
总的来说是

  1. 框架开发中的动态配置
  2. 插件开发中的持续集成
  3. 应用扩展
  4. ...

1)Java 的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石。而一般应用层面很少用。经典的就是 在xml文件或者properties 里面写好了配置,然后在 Java 类里面解析 xml 或 properties 里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的 Class 实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去 new 或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java 类里面不一定能直接调用另外的方法,这时候也可以通过反射机制来实现。
总的来说,自己写的很少,具体什么时候要用那要看需求,反射机制无非就是根据一个 String 来得到你要的实体对象,然后调用它原来的东西。但是如果是要自己写框架的话,那就会用得比较多了。
2)当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以无法在代码中 New 出来,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。
3)在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码 new ClassName(),而必须用到反射才能创建这个对象.反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的 dll 都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把 dll 加载进内存,然后通过反射的方式来调用 dll 中的方法。很多工厂模式就是使用的反射。

缺点

一般并不建议在业务代码中用反射

  1. 代码可读性变差,如果出错只能在运行时才会报错。
  2. 性能相比直接写的 java 代码差很多。
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zonghua

    Spring 用的 aspectJ 是静态代理