默认情况下一个对象可以访问另一个对象的私有成员,所以在编译是打开字节码验证器,如下:
javac -verify Event.java
可保证代码的安全。

解决方案 »

  1.   

    冒昧问一句:Hibernate是什么东西,好像看到过又忘记了
      

  2.   

    不加-verify私有成员也不能被访问吧
      

  3.   

    可以吗?还有,你这个类的构造函数也是private的,在本类外面可以new出来吗?
      

  4.   

    楼上,这就是Hibernat的例子,我只是不知道他的原理。
      

  5.   

    如果可以,感觉java的类违背了类的定义,那么java类中private域的数据也就不安全了。
      

  6.   

    应该是通过反射访问的。
    那跟语法级别上的访问是两码事,没什么违背不违背的。
    建议楼主要么先把这个问题放一放,要么就拿出点时间研究一下Java的反射。
      

  7.   

    java提供了java.lang.reflect.*这个包,使得编写一个reflection程序变得非常简单,但通过reflection来操作一个private的method或new出一个private构造方法的类是违背了类的定义,下面写一个例子,这个类有一个记数器变量,每new出一个类记数器加1,然而私有的add方法用reflection来调用将使得这个类非常的不安全,一但被外部调用这个类的数据一致性也将被破坏。spring中用了太量的reflection机制,通过spring的beanfactory也能构造出一个private构造方法的类,只是感觉能这样操作一个类很不安全很不妥当。class c1{
      static private int ref =0;  public c1(){
        add;
      }  private void add(){
        ref++;
      }}
      

  8.   

    我也知道使用了反射机制,所以写了个反射测试程序,结果犯了两点错误,导致失败。没有用getDeclaredXXX系列的方法,结果private的方法直接找不到,另外没有使用setAccessible方法,汗......多谢楼上各位高手!!!
      

  9.   

    to MHB(秋天的风):刚才看了javadoc中的AccessibleObject的说明,其中有这么一段话:Setting the accessible flag in a reflected object permits sophisticated applications with sufficient privilege, such as Java Object Serialization or other persistence mechanisms.看来适合使用反射的应用有序列化、持久化应用等,hibernate正属于持久化应用,呵呵......
      

  10.   

    搜索了下hibernate的源代码,其中居然没有reflect这个词,也就是没有导入java.lang.reflect这个包,奇怪......