为什么Hibernate能直接访问private的方法?

withwind 2005-07-19 10:42:36
最近看了Hibernate的文档,其中有一段大致意思如下:

一个持久化类,带有一些简单的属性(property)。

public class Event {
private Long id;
private String title;

Event() {}

public Long getId() { return id; }
private void setId(Long id) { this.id = id; }

public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}

Hibernate可以直接访问被声明为public,private和protected等不同级别访问控制的方法(accessor method)和字段(field)。




请问,为什么对象的private的方法也可以被访问呢?

...全文
641 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
withwind 2005-07-20
  • 打赏
  • 举报
回复
搜索了下hibernate的源代码,其中居然没有reflect这个词,也就是没有导入java.lang.reflect这个包,奇怪......
withwind 2005-07-20
  • 打赏
  • 举报
回复
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正属于持久化应用,呵呵......
withwind 2005-07-20
  • 打赏
  • 举报
回复
我也知道使用了反射机制,所以写了个反射测试程序,结果犯了两点错误,导致失败。没有用getDeclaredXXX系列的方法,结果private的方法直接找不到,另外没有使用setAccessible方法,汗......

多谢楼上各位高手!!!
MHB 2005-07-20
  • 打赏
  • 举报
回复
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++;
}

}
gzg0141 2005-07-19
  • 打赏
  • 举报
回复
冒昧问一句:Hibernate是什么东西,好像看到过又忘记了
linus_lee 2005-07-19
  • 打赏
  • 举报
回复
默认情况下一个对象可以访问另一个对象的私有成员,所以在编译是打开字节码验证器,如下:
javac -verify Event.java
可保证代码的安全。
Preamble 2005-07-19
  • 打赏
  • 举报
回复
setAccessible(true);
晨星 2005-07-19
  • 打赏
  • 举报
回复
应该是通过反射访问的。
那跟语法级别上的访问是两码事,没什么违背不违背的。
建议楼主要么先把这个问题放一放,要么就拿出点时间研究一下Java的反射。
MHB 2005-07-19
  • 打赏
  • 举报
回复
如果可以,感觉java的类违背了类的定义,那么java类中private域的数据也就不安全了。
DanielYWoo 2005-07-19
  • 打赏
  • 举报
回复
反射可以调用私有成员
withwind 2005-07-19
  • 打赏
  • 举报
回复
楼上,这就是Hibernat的例子,我只是不知道他的原理。
MHB 2005-07-19
  • 打赏
  • 举报
回复
可以吗?还有,你这个类的构造函数也是private的,在本类外面可以new出来吗?
withwind 2005-07-19
  • 打赏
  • 举报
回复
不加-verify私有成员也不能被访问吧

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧