- 浏览: 310407 次
- 性别:
- 来自: 广州/成都
最新评论
-
lgh1992314:
Godlikeme 写道<div class='quot ...
使用JDBC时Class.forName()的作用 -
lgh1992314:
Class.forName("com.mysql.j ...
使用JDBC时Class.forName()的作用 -
sandaobusi:
nkd2002 写道“我们完全可以用这样一句代替它:”博主这名 ...
使用JDBC时Class.forName()的作用 -
nkd2002:
“我们完全可以用这样一句代替它:”博主这名句话有错误,第二段代 ...
使用JDBC时Class.forName()的作用 -
topcoder_lin:
写的很好!!!!
使用JDBC时Class.forName()的作用
这个问题是跟同学讨论interface Serializable的用法是注意到的。JDK文档中说Serializable 为标记接口(tag interface),实现该接口的类不需要实现任何指定的方法。但是,如果当我们需要自定义序列化过程时,就需要在类中添加两个指定的方法:
嗯,private?确实这样。按常理说,这两个方法应该是被ObjectOutputStream和ObjectInputStream对象的writeObject和readObject方法调用的,这符合面向对象的封装规则:序列化就应该是对象自身的责任。但是,这两个方法设定为private,那么其他对象如何访问呢?当然,因为Serializable对象的序列化工作由jvm内置支持的,因此方法存取权限当然不是问题,但是Java将其设定为private有什么好处呢?
其实,我们也可以访问对象的私有方法的,使用反射机制便可:
这个又有什么用处呢?嗯,使用Junit测试私有方法的时候就可以派上用场了,可以看看Bill Venners的叙述:Testing Private Methods with JUnit and SuiteRunner
。。敲完以后提示我权限不够,session超时吧,后退找不回来了,只好重敲了一遍,痛:(
因为这两个方法是由ObjectOutputStream
的writeObject方法和ObjectInputStream
的readObject来调用的,而不是让所有人都可以想当然的调用,从而给编程人员带来误导。就好比将一个key的具体类型告诉给编程人员,这会让程序员以为特定于类型的操作是被鼓励的,但遗憾的是很多情况下并不是这样!
java 代码
- private void writeObject(java.io.ObjectOutputStream out)
- throws IOException
- private void readObject(java.io.ObjectInputStream in)
- throws IOException, ClassNotFoundException;
其实,我们也可以访问对象的私有方法的,使用反射机制便可:
java 代码
- import java.lang.reflect.Method;
- public class EatApple {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception{
- new EatApple().eat();
- }
- public void eat() throws Exception{
- Apple apple = new Apple();
- Method m = apple.getClass().getDeclaredMethod("taste",new Class[] {});
- m.setAccessible(true);
- Object result = m.invoke(apple, new Object[] {});
- }
- }
- class Apple{
- private void taste(){
- System.out.println("Delicious!");
- }
- }
。。敲完以后提示我权限不够,session超时吧,后退找不回来了,只好重敲了一遍,痛:(
评论
5 楼
SunMicro
2007-03-29
Dustin 写道
目送完可否解析一下为什么Java在处理序列化这个问题上要采用添加private方法这种方式呢?
因为这两个方法是由ObjectOutputStream
的writeObject方法和ObjectInputStream
的readObject来调用的,而不是让所有人都可以想当然的调用,从而给编程人员带来误导。就好比将一个key的具体类型告诉给编程人员,这会让程序员以为特定于类型的操作是被鼓励的,但遗憾的是很多情况下并不是这样!
4 楼
FrankTaylor
2007-03-29
<br/>
<strong>Dustin 写道:</strong><br/>
<div class='quote_div'> 这个问题是跟同学讨论interface Serializable的用法是注意到的。JDK文档中说Serializable 为标记接口(tag interface),实现该接口的类不需要实现任何指定的方法。但是,如果当我们需要自定义序列化过程时,就需要在类中添加两个指定的方法:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> writeObject(java.io.ObjectOutputStream out) </span></span> </li>
<li class=''><span> </span><span class='keyword'>throws</span><span> IOException </span> </li>
<li class='alt'><span/><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> readObject(java.io.ObjectInputStream in) </span> </li>
<li class=''><span> </span><span class='keyword'>throws</span><span> IOException, ClassNotFoundException; </span> </li>
</ol>
</div>
嗯,private?确实这样。按常理说,这两个方法应该是被ObjectOutputStream和ObjectInputStream对象的writeObject和readObject方法调用的,这符合面向对象的封装规则:序列化就应该是对象自身的责任。但是,这两个方法设定为private,那么其他对象如何访问呢?当然,因为Serializable对象的序列化工作由jvm内置支持的,因此方法存取权限当然不是问题,但是Java将其设定为private有什么好处呢?<br/>
其实,我们也可以访问对象的私有方法的,使用反射机制便可:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>import</span><span> java.lang.reflect.Method; </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span/><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> EatApple { </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> </span><span class='comment'>/** </span> </li>
<li class=''><span><span class='comment'> * @param args </span> </span> </li>
<li class='alt'><span><span class='comment'> */</span><span> </span></span> </li>
<li class=''><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> main(String[] args) </span><span class='keyword'>throws</span><span> Exception{ </span> </li>
<li class='alt'><span> </span><span class='keyword'>new</span><span> EatApple().eat(); </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> eat() </span><span class='keyword'>throws</span><span> Exception{ </span> </li>
<li class=''><span> Apple apple = </span><span class='keyword'>new</span><span> Apple(); </span> </li>
<li class='alt'><span> Method m = apple.getClass().getDeclaredMethod(</span><span class='string'>"taste"</span><span>,</span><span class='keyword'>new</span><span> Class[] {}); </span> </li>
<li class=''><span> m.setAccessible(</span><span class='keyword'>true</span><span>); </span> </li>
<li class='alt'><span> Object result = m.invoke(apple, </span><span class='keyword'>new</span><span> Object[] {}); </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span>} </span> </li>
<li class='alt'><span> </span> </li>
<li class=''><span/><span class='keyword'>class</span><span> Apple{ </span> </li>
<li class='alt'><span> </span><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> taste(){ </span> </li>
<li class=''><span> System.out.println(</span><span class='string'>"Delicious!"</span><span>); </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span> } </span> </li>
</ol>
</div>
这个又有什么用处呢?嗯,使用Junit测试私有方法的时候就可以派上用场了,可以看看Bill Venners的叙述:<a href='http://www.artima.com/suiterunner/private.html'><span class='ts'>Testing Private Methods with JUnit and SuiteRunner</span><br/>
</a> 。。敲完以后提示我权限不够,session超时吧,后退找不回来了,只好重敲了一遍,痛:(</div>
<br/>
<br/>
<br/>
312312132<br/>
<strong>Dustin 写道:</strong><br/>
<div class='quote_div'> 这个问题是跟同学讨论interface Serializable的用法是注意到的。JDK文档中说Serializable 为标记接口(tag interface),实现该接口的类不需要实现任何指定的方法。但是,如果当我们需要自定义序列化过程时,就需要在类中添加两个指定的方法:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> writeObject(java.io.ObjectOutputStream out) </span></span> </li>
<li class=''><span> </span><span class='keyword'>throws</span><span> IOException </span> </li>
<li class='alt'><span/><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> readObject(java.io.ObjectInputStream in) </span> </li>
<li class=''><span> </span><span class='keyword'>throws</span><span> IOException, ClassNotFoundException; </span> </li>
</ol>
</div>
嗯,private?确实这样。按常理说,这两个方法应该是被ObjectOutputStream和ObjectInputStream对象的writeObject和readObject方法调用的,这符合面向对象的封装规则:序列化就应该是对象自身的责任。但是,这两个方法设定为private,那么其他对象如何访问呢?当然,因为Serializable对象的序列化工作由jvm内置支持的,因此方法存取权限当然不是问题,但是Java将其设定为private有什么好处呢?<br/>
其实,我们也可以访问对象的私有方法的,使用反射机制便可:<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>import</span><span> java.lang.reflect.Method; </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span/><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> EatApple { </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> </span><span class='comment'>/** </span> </li>
<li class=''><span><span class='comment'> * @param args </span> </span> </li>
<li class='alt'><span><span class='comment'> */</span><span> </span></span> </li>
<li class=''><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> main(String[] args) </span><span class='keyword'>throws</span><span> Exception{ </span> </li>
<li class='alt'><span> </span><span class='keyword'>new</span><span> EatApple().eat(); </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> eat() </span><span class='keyword'>throws</span><span> Exception{ </span> </li>
<li class=''><span> Apple apple = </span><span class='keyword'>new</span><span> Apple(); </span> </li>
<li class='alt'><span> Method m = apple.getClass().getDeclaredMethod(</span><span class='string'>"taste"</span><span>,</span><span class='keyword'>new</span><span> Class[] {}); </span> </li>
<li class=''><span> m.setAccessible(</span><span class='keyword'>true</span><span>); </span> </li>
<li class='alt'><span> Object result = m.invoke(apple, </span><span class='keyword'>new</span><span> Object[] {}); </span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span>} </span> </li>
<li class='alt'><span> </span> </li>
<li class=''><span/><span class='keyword'>class</span><span> Apple{ </span> </li>
<li class='alt'><span> </span><span class='keyword'>private</span><span> </span><span class='keyword'>void</span><span> taste(){ </span> </li>
<li class=''><span> System.out.println(</span><span class='string'>"Delicious!"</span><span>); </span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span> } </span> </li>
</ol>
</div>
这个又有什么用处呢?嗯,使用Junit测试私有方法的时候就可以派上用场了,可以看看Bill Venners的叙述:<a href='http://www.artima.com/suiterunner/private.html'><span class='ts'>Testing Private Methods with JUnit and SuiteRunner</span><br/>
</a> 。。敲完以后提示我权限不够,session超时吧,后退找不回来了,只好重敲了一遍,痛:(</div>
<br/>
<br/>
<br/>
312312132<br/>
3 楼
歆渊
2007-03-29
推荐试试用Opera 上 JavaEye, 可以一直无损失后退.
顺便鄙视一下 IE 和 FireFox.
顺便鄙视一下 IE 和 FireFox.
2 楼
Dustin
2007-03-29
目送完可否解析一下为什么Java在处理序列化这个问题上要采用添加private方法这种方式呢?
1 楼
shaucle
2007-03-29
要目送楼主了...
发表评论
-
Linux内存管理
2011-05-21 23:42 2439首先提供Gustavo Duarte写的三篇非常精彩的文章: ... -
RSA算法密钥长度的选择
2010-09-15 15:07 16629RSA算法密钥长度的选择是安全性和程序性能平衡的结果,密钥 ... -
Python code snip
2009-10-28 22:22 1825Python Tips, Tricks, and Hacks ... -
C++ code snip
2009-08-23 18:01 18361. 将文件内容读取为string a. s ... -
多重继承和Mixin
2009-04-06 22:46 01. c++多重继承 http://www.newlc.com ... -
使用DataSource的连接池何以提高性能?
2009-04-06 22:03 1954最初发表在这里。 连接池为什么能够提高性能呢? ... -
1.03 - 0.42 = ?
2009-04-06 21:45 1534最初发表在这里。 0.6 ... -
C/C++库文件简介
2009-04-06 21:25 2728最初发表在这里。 ... -
多态(Polymorphism)的实现机制(下)--Java篇
2009-04-06 21:14 3288最初发表在这里。 ... -
多态(Polymorphism)的实现机制(上)--C++篇
2009-04-06 20:48 3881最初发表在这里。 多态(Polymorph ... -
awk引用shell中带meta字符的字符串
2009-03-25 20:45 2161link='http://localhost:8080 Blo ... -
Two extractors couldn't work together
2008-01-12 01:32 1592Hi,everyone I have enjoyed Scr ... -
C++的常量
2007-05-31 11:20 1672Java里面使用常量十分方便,将成员变量定义为fina ... -
Python中文问题研究
2007-05-07 18:30 10909我曾经在深入浅出java中文问题系列中研究过java的中文 ... -
深入浅出Java中文问题(六) 文件读写
2007-05-07 17:16 8188最近用Java处理文 ... -
深入浅出java中文问题(五)数据库出现的中文问题
2007-05-07 17:14 3891数据库的重要作用无需多言,java也为我们提供了多种数据 ... -
深入浅出java中文问题(四)Web应用中的中文问题
2007-05-07 17:12 2823Web应用中出现的中 ... -
深入浅出java中文问题(三)console程序的中文问题
2007-05-07 17:08 4483现代计算机采用的 ... -
深入浅出Java中文问题(二)字符,字节和编码
2007-05-07 17:03 4762通过引言我们可以 ... -
深入浅出Java中文问题(一) 引言
2007-05-07 16:59 3329真正接触过java,或 ...
相关推荐
本文实例讲述了PHP实现在对象之外访问其私有属性private及保护属性protected的方法。分享给大家供大家参考,具体如下: public 表示全局的访问权限,类内部外部子类都可以访问; private表示私有的访问权限,只有本...
主要给大家介绍了关于如何直接访问php实例对象中private属性的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问...
用java代码来解析private、public、default、protected的权限问题
#include using namespace std; class Test { public: Test(int = 0); void print()const; private: int x; }; Test::Test(int value) :x(value) { }....
不区分public和private都可以反射,请小心使用 * 4....暂时不支持泛型方法,in和out参数的方法,有好的建议可以联系我 * 5....中文注释已经比较全面 * * 有建议或者BUG可以联系:fttl_398@126.com * 所有提供建议...
类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的。 在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,这样编译器会阻止任何来自外部非友元的直接访问。 ...
意思是:C++中,对于类A,只要能访问类A,就能访问A的对象的private方法。 Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法。 因为Ruby的原则是“private意为你不能指定方法接收者”,接收者只能...
如果前面没有标明访问权限,默认访问权限为private。 类的成员有数据成员与函数成员两类,类的数据成员和函数成员统称为类的 成员,类的数据成员一般用来描述该类对象的属性,称为属性;函数成员是描 述类行为,...
PHP 类的访问控制与封装 public,protected,private 修饰符 8. PHP 自动加载类 __autoload() 方法 9. 范围解析操作符(::) 10. PHP 类的静态成员属性与静态方法 static 关键字 11. PHP 常量(const) 12. PHP ...
类属性成员变量局部变量属性赋值的先后顺序成员变量和局部变量的异同点方法方法声明权限修饰符:public protected 缺省 private;返回值类型:没有返回值:采用void 关键字;具体的返回值类型:int、String、double等...
#include using namespace std; class Count { public: //public data is dangerous //sets the value of private data member x void setX(int value) { x = value; }......
成员方法的声明格式: [<修饰符>]<返回类型> <方法名> ([<参数表列>]) [throws <异常类>] { 方法体 } 修饰符: 方法的访问权限(缺省的、public、protected和private) static: 类方法(静态方法); abstract: 抽象...
private(私有的 ) 被定义为private的成员,对于类内部所有成员都可见,没有访问限制。对类外部不允许访问。 图解demo复制代码 代码如下:class Woman{ public $name = “gaojin”; protected
类O、P和Q的对象都可以访问方法F2 B.类P和Q的对象都可以访问方法F2 C.类0和Q的对象都可以访问方法F2 D.只有在类P内才能访问方法F2 (28)A.类0、P和Q的对象都可以访问方法F3 B.类0、P和Q的对象都不可以...
则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰 –3.该类还必须缓存已经创建的对象,必须用static修饰 final变量 •final修饰变量时,表示该变量一旦获得 ...
要想访问对象中的成员就要使用一个特殊的操 作符“->”来完成对象成员的访问: LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》70/104 对象->属性$p1->...
4、子类复写父类中的方法时,子类中的 访问修饰符的范围要大于等于 父类的【 继承只能发扬光大,至少保持不变。不可以丢失东西。】 以上这篇浅谈php中的访问修饰符private、protected、public的作用范围就是小编分享...
(2)能用foreach遍历访问的对象需要实现 IEnumerable接口或声明GetEnumerator 方法的类型 (3)列举ADO.net中的五个主要对象 Command、Connection、DataSet、DataAdapter、DataReader。 2. 不定项选择: (1) 以下...