差了一些资料,还是看不太明白,都是说允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。这样的话,随便一个class都可以看到内部结构,不就不安全了吗,反编译是不是这样弄出来的?

解决方案 »

  1.   

    反射后获取的class我们还可以调用他的私有方法呢
    呵呵,那不是更不安全
     
      

  2.   

    反射里所说的安全不安全,是说通过反射的方式,可以访问对象的非公开部分,那么对象本身不安全。并不是class不安全,class是字节码,也算透明的,如果了解字节码的解析都可以破译字节码。反编译不是这样弄出来的,反编译和反射没有关系,反编译是字节码级别的破译,程序运行不运行没关系,反射是对象级别的强制访问,程序不运行也就没反射什么事了。
    有些人为了保护自己的代码,所以在编译成class的时候做了混淆,也就是相当于给字节码做了加密,这是对于反编译所说安全问题,和反射的安全问题完全两回事。
      

  3.   

    反射是代码级别的,字节码是虚拟机级别的,不一样。
    反射是从JAVA语言层提供的实现未知类特定方法调用的机制。
      

  4.   

    反射就是把一个类的各个成分映射成相应的java类。
      

  5.   

    关于安全问题,如果你不希望别人调用你的方法,可以加保护嘛。
    凡是public的方法,你为什么害怕别人知道呢?这不与设计目标违背了吗?反编译与反射是两回事,有兴趣可以去查看JAVA虚拟机规范。
      

  6.   


    Class<?> cls = Class.forName(bean.getClsName());
    Method method = cls.getMethod("putDynamicInfo", String.class, String.class);
    method.invoke(bean, new Object[] {"id", "001"});
      

  7.   

    Reflection是Java中很有用的一个机制,为编程提供了很强大的灵活性。
    获取某个Class的内部信息是为了应用它们,而不是反编译它们。
    比如说通过Reflection探知class内部有个getBeauty()方法,你就可以调用它来获得美女了。但getBeauty()方法内部是怎样编写的你仍然不知道(也没必要知道)。
    Reflection让动态调用成为可能。试想一下如果没有Reflection,Struts2怎么可能根据客户端传来的属性名称在后台的Action中调用相关的get方法呢。
      

  8.   

    換個思維吧,就當是JAVASCRIPT(弱類型語言),javascript也是不用知道定義了什麽屬性、方法,直接xxx.method()就可以用了所以反射也是給出一大堆字符(類名,方法名……等),然後就可以得到個什麽