最近听到一句话:“反射,反射,程序员的快乐”,只是大概学习了,反射也没有发现它有什么用处,请大家赐教!

解决方案 »

  1.   

    看来LZ没有了解反射的真正用途,而且对面向对象编程好像也不太了解。比如我们可以设定这样一个场景:
    一个抽象工厂,N个继承父类或实现接口的业务类,当每次有新的子类时,我们不必将任何子类的实现写到工厂中,只需要向一个配置文件中写入该子类的完整名称,在需要时,读取该子类名的配置文件,就能得到该子类,而且日后就算有新的业务子类出现,该工厂也不必修改了。只要知其名,就能得其类。在面向对象编程中非常有用。当然,既然方便了,同时也必需牺牲性能。
      

  2.   

    Spring的配置文件就反射机制的应用,跟二楼的一个意思....
      

  3.   

    直接上代码public class Reflection {
    public static void main(String[] args) {
    final Constructor<?>[] constructors = Singleton.class.getDeclaredConstructors();

    for(Constructor<?> constructor :constructors) {
    constructor.setAccessible(true);

    try {
    constructor.newInstance(new Object[0]);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }}class Singleton {
    private Singleton() {
    // non-instantiable
    System.out.println(" Oh no! I'm instantiated");
    }
    }
      

  4.   

    所以有时有如果你的一个类不想被其他类实例化,不仅仅是把构造器设置为private,而且在构造器中还抛出一个异常比如:IllegalAccessException
      

  5.   

    当然这样也不是一定的 如果存在安全管理器而且验证不通过就会出现异常,具体参考 AccessibleObject.setAccessible()的API
      

  6.   

    一句话方便,像几乎所有的java框架都有用到反射机制。
      

  7.   

    我建议你还是找本书好好看看,比如《Java核心技术,卷1》。先了解一下反射库的用法及反射的定义。所谓的反射就是能够分析类能力的程序。它能让你创建对象变的很容易,比如Class.forName(driver).newInstance(),驱动加载;能让你动态的获取类名和方法名,还有属性。当你迭代比较属性值的时候,变得更灵活。因为当你要对JavaBean增加一个属性的时候,你不用更改比较算法。具体的实用方法,建议你多参考一下Java API。
      

  8.   

    反射有个问题是效率,可以解决不同JDK版本的class访问问题。
      

  9.   

    反射是java的一个bug,前面士兵正在浴血奋战,结果后院起火了,敌人抄了近道.
      

  10.   

    struts 就用到了反射机制.只需要把子类路径写到配置文件中.就可以在运行时实例化子类对象.