如何访问私有成员?

ding 2003-10-15 08:36:37
背景:
在某项目中,需要根据方法的形式参数来实例化相应的对象以便对方法进行测试。例如有一个方法:
public void test(SomeObject obj)
其中SomeObject的源代码有可能得不到(调用第三方的包时),需要实例化一个SomeObject,并且可以对SomeObject的各个成员变量(包括私有)随意赋值?

现在的问题在于:
使用java.lang.reflect中的相应方法,只能得到各个成员变量的声明,不能设置私有成员变量的值;
由于不清楚被测试类中各个方法的语义,无法使用现有的方法来对私有成员变量赋值;
由于没有源代码,对源代码打桩也是不可能实现的。

那么,请问,怎样才能实例化一个类,并能对其所有成员随意赋值?
...全文
148 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarsZ 2003-10-16
  • 打赏
  • 举报
回复
用反编译软件
liuchuan 2003-10-16
  • 打赏
  • 举报
回复
Java在类的接口方面要求的很严格。
北极猩猩 2003-10-16
  • 打赏
  • 举报
回复
楼上的,看清楚,人家说了不能修改源代码的
honkyjiang 2003-10-16
  • 打赏
  • 举报
回复
加上get set 方法就是了!! private 不可能从外面直接访问的 !
private String name = null;
public void set_Name(String str){
name = str;
}

public String get_Name(){
return name;
}
jkit 2003-10-16
  • 打赏
  • 举报
回复
修改jvm,使得private也能在外面访问。
或者自己实现native方法,实现对private方法,变量的访问。
ding 2003-10-16
  • 打赏
  • 举报
回复
首先谢谢各位的关注.

需要随意对私有成员赋值的动机来源于在对一个方法进行结构化测试(比如说条件/分支覆盖),需要给方法提供不同的参数以便于能够最大限度的走遍方法当中的所有条件/分支.由于不知道方法本身的语义(方法是任意指定的,没有什么信息可以指明方法的语义),所以需要寻找一种途径,能够设置对象的状态.
Schlemiel(维特根斯坦的扇子)的方法我曾经使用过,但是这样的方法难以保证对象状态的一致性.例如有一个类有一个私有成员,表明了一个人的年龄.自然这个成员的有效取值范围绝对不应该超过0-200,可是我可以随便设一个10000,这样的状态还有什么意义?
我曾经考虑过的方法有如下几项:

方法 缺点
代码注射.直接修改对象相对应的字节码, 实现过于复杂,并且也
在代码中添加一个方法,通过这个方法 难以保证对象状态的一致性。
来对私有成员进行修改。

Schlemiel的方法。相对来说,这是最 也难以保证对象状态的一致性。
容易的一种方法。

扫描源代码,找出哪些方法修改了哪 需要有源代码,如果没有源代码
些数据成员,然后通过这些方法修改 ,则无能为力。而很多方法的参
数据成员。 数都有可能是标准库中的类或者
第三方的类。另外,直觉告诉我
这个方法还有一点点不对劲,
没有找出到底是什么。

总之来说,这个问题涉及到面向对象语言的语义问题,很困难。能不能采取另外的方式?怎样才能不需要设置对象的状态呢?
zkjbeyond 2003-10-16
  • 打赏
  • 举报
回复
class bean1
{
private String a1;
private String a2;
public void setvalue1(String a)
{
this.a1=a;
}
public void setvalue2(String a)
{
this.a2=a;
}
}

这样就OK拉
sharewarer 2003-10-16
  • 打赏
  • 举报
回复
私有成员只能由类提供的接口去访问。
instigator 2003-10-16
  • 打赏
  • 举报
回复
堡垒是最容易从内部攻破的
可以试一试能不能增加一个内部类
那样在从外部就可以很容易的进入修改了
呵呵
说的不对,您多包涵
hooku 2003-10-16
  • 打赏
  • 举报
回复
楼主自己都说是私有成员了,会不知道外部类不能访问吗?
fft123 2003-10-16
  • 打赏
  • 举报
回复
别人都已经定义成私有的了
肯定就是不想让你访问,或者认为你没有必要去访问这些变量

问楼主一个问题:你访问这些私有变量的目的和意义何在?如果真想访问,只有对class文件反编译,然后自己修改
hbDeng 2003-10-16
  • 打赏
  • 举报
回复
私有成员只能由类提供的接口去访问。没有其它办法了。
chifengwatch 2003-10-16
  • 打赏
  • 举报
回复
up
北极猩猩 2003-10-16
  • 打赏
  • 举报
回复
私有成员是对象的内部结构,再测试时是不需要进行赋值的阿
CNSC 2003-10-15
  • 打赏
  • 举报
回复
既然设置成private说明已经不希望你去直接操作他了,可能类的设计者会给你提供向set的public的方法去设置吧
LuZhou 2003-10-15
  • 打赏
  • 举报
回复
应该将要访问的成员变量改成public的。
seaman0916 2003-10-15
  • 打赏
  • 举报
回复
既然私有变量都能随意赋值了,私有的意义何在? 岂不是Java的大漏洞?

我觉得不太可能!
jianlin 2003-10-15
  • 打赏
  • 举报
回复
up一下
conning333 2003-10-15
  • 打赏
  • 举报
回复
给你up吧,俺不是很了解,还是别随便发言了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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