powerwind 发表于 2006-7-28 18:04

[已解决]Hibernate为什么可以访问private的setXXX()方法

在孙卫琴的<<精通Hibernate>>一书中的第九十八页有这样的一句:


JAVA应用程序不能访问持久化类的private类型的getXXX()和setXXX()方法,而Hibernate没有这个限制,它能够访问各种级别的getXXX()和setXXX()方法


这是为什么?
Hibernate是怎样做到的?
反射机制吗?

请高手解惑

[ 本帖最后由 powerwind 于 2006-10-12 13:20 编辑 ]

wool王 发表于 2006-7-29 00:24

貌似不可以.楼主看错了吧?要不就是孙写错了.

powerwind 发表于 2006-7-29 00:53


Hibernate Reference Documentation 3.1.3

The no-argument constructor is a requirement for all persistent classes; Hibernate has to create objects for you, using Java Reflection. The constructor can be private, however, package visibility is required for runtime proxy generation and efficient data retrieval without bytecode instrumentation.



楼上有空研究下

powerwind 发表于 2006-7-29 01:30

中文文档是这样的:

所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。

wool王 发表于 2006-7-29 09:06

这贴关注。。。我有空去请教下人。。。

深圳情缘 发表于 2006-7-29 23:36

路过

路过!!!
关注!!!

wool王 发表于 2006-8-2 00:30

问了人.貌似不可以...自反射机制需要有公开的setter和getter...要不就破坏了封装性....那OO还有什么意义...

powerwind 发表于 2006-8-2 01:13

可能内有玄机

powerwind 发表于 2006-8-2 09:25

我也觉得 不可以。也许是理解错了,它并不是说要真正访问setter和getter。具体如何我又说不清楚。
比如 Hibernate 要求持久化类一定要有一个无参构造方法,如果没有,它就抛出异常。如果有一个 private 访问级别的无参构造方法,它也不会抛出异常。这其中里面 Hibernate 可能并没有做什么,只是确认持久化类有定义某种方法。同理,setter和getter也这样。

以上是我的猜测。

powerwind 发表于 2006-8-2 22:42

所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。

Java反射机制也要求 public 级别才可以反射啊!
白皮书这样说,实在费解!

wool王 发表于 2006-8-2 22:57

最近研究公司核心产品的架构,,,发现好多地方用了java自反射机制...我接下来会详细研究这方面,,,顺便看能否解决楼主的问题.

用程序诠释生命 发表于 2006-8-2 23:15

为什么不试试到源代码里找答案呢?

源代码一定可以给你正确答案.

开源就好在这里啦.不需要任何文档

powerwind 发表于 2006-8-3 00:00

源代码那么多,从何查起呢?

用程序诠释生命 发表于 2006-8-3 19:56

怎么查,就需要思考了.

开源大环境下,如果连这点都做不到,就浪费了那么多开放的源代码了.

powerwind 发表于 2006-8-3 20:57

感觉与Bean的内省机制有关,但是Hibernate 的相关资料中多次提到反射机制,而内省机制没有说过。
对内省机制也不太了解,而反射机制似乎不能做到,就这样去查源码,如大海捞针。
还是等高手解惑。

powerwind 发表于 2006-8-18 15:26

好像和 cglib 有关,可这方面的资料很少,英文的较多却不想看。
谁可以推荐点 cglib 相关读物啊?

iptton 发表于 2006-8-18 15:43

还是向现实低头吧……

好的资料一般都是E文的

等有人翻译了,新的技术又出现了

像AS    2.0还没有多少人翻译出来,3.0就出来了

powerwind 发表于 2006-8-18 15:47

E 文可以看,但作为入门来看是很累的。
我已经很累了

powerwind 发表于 2006-8-19 21:02

又有新发现

在 <<J2ee development without ejb>>中文版 283页,有这样一句:
请注意,如果映射JavaBean属性,只跟Hibernate持久化相关的那些getter和setter可以是protected甚至private的,以保证由应用程序驱动字段的可见度.
页尾有这样的注释:
译者注:然而据译者的观察,如果将 setter声明为private,会导致 Hibernate 无法使用CGLIB优化的反射机制,只能通过标准的JAVA反射机制为持久对象

深圳情缘 发表于 2006-8-22 23:33

顶顶

未扎手即系未解决啦
页: [1] 2
查看完整版本: [已解决]Hibernate为什么可以访问private的setXXX()方法