工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3983|回复: 26

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

[复制链接]
发表于 2006-7-28 18:04 | 显示全部楼层 |阅读模式
在孙卫琴的<<精通Hibernate>>一书中的第九十八页有这样的一句:


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


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


请高手解惑

[ 本帖最后由 powerwind 于 2006-10-12 13:20 编辑 ]
发表于 2006-7-29 00:24 | 显示全部楼层
貌似不可以.楼主看错了吧?要不就是孙写错了.
回复

使用道具 举报

 楼主| 发表于 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.


楼上有空研究下
回复

使用道具 举报

 楼主| 发表于 2006-7-29 01:30 | 显示全部楼层
中文文档是这样的:
所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。
回复

使用道具 举报

发表于 2006-7-29 09:06 | 显示全部楼层
这贴关注。。。我有空去请教下人。。。
回复

使用道具 举报

发表于 2006-7-29 23:36 | 显示全部楼层

路过

路过!!!
关注!!!
回复

使用道具 举报

发表于 2006-8-2 00:30 | 显示全部楼层
问了人.貌似不可以...自反射机制需要有公开的setter和getter...要不就破坏了封装性....那OO还有什么意义...
回复

使用道具 举报

 楼主| 发表于 2006-8-2 01:13 | 显示全部楼层
可能内有玄机
回复

使用道具 举报

 楼主| 发表于 2006-8-2 09:25 | 显示全部楼层
我也觉得 不可以。也许是理解错了,它并不是说要真正访问settergetter。具体如何我又说不清楚。
比如 Hibernate 要求持久化类一定要有一个无参构造方法,如果没有,它就抛出异常。如果有一个 private 访问级别的无参构造方法,它也不会抛出异常。这其中里面 Hibernate 可能并没有做什么,只是确认持久化类有定义某种方法。同理,settergetter也这样。

以上是我的猜测。
回复

使用道具 举报

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

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

使用道具 举报

发表于 2006-8-2 22:57 | 显示全部楼层
最近研究公司核心产品的架构,,,发现好多地方用了java自反射机制...我接下来会详细研究这方面,,,顺便看能否解决楼主的问题.
回复

使用道具 举报

发表于 2006-8-2 23:15 | 显示全部楼层
为什么不试试到源代码里找答案呢?

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

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

使用道具 举报

 楼主| 发表于 2006-8-3 00:00 | 显示全部楼层
源代码那么多,从何查起呢?
回复

使用道具 举报

发表于 2006-8-3 19:56 | 显示全部楼层
怎么查,就需要思考了.

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

使用道具 举报

 楼主| 发表于 2006-8-3 20:57 | 显示全部楼层
感觉与Bean的内省机制有关,但是Hibernate 的相关资料中多次提到反射机制,而内省机制没有说过。
对内省机制也不太了解,而反射机制似乎不能做到,就这样去查源码,如大海捞针。
还是等高手解惑。
回复

使用道具 举报

 楼主| 发表于 2006-8-18 15:26 | 显示全部楼层
好像和 cglib 有关,可这方面的资料很少,英文的较多却不想看。
谁可以推荐点 cglib 相关读物啊?
回复

使用道具 举报

发表于 2006-8-18 15:43 | 显示全部楼层
还是向现实低头吧……

好的资料一般都是E文的

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

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

使用道具 举报

 楼主| 发表于 2006-8-18 15:47 | 显示全部楼层
E 文可以看,但作为入门来看是很累的。
我已经很累了
回复

使用道具 举报

 楼主| 发表于 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 | 显示全部楼层

顶顶

未扎手即系未解决啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-13 03:21

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表