经典难题,希望各位高手不惜赐教(CSDN群英会,群雄献策吧)

qybao 2007-11-13 01:19:33
题目参加下面的帖子
http://topic.csdn.net/u/20071112/16/6306f9b2-f861-4646-8f02-70342e1c7f2b.html?seed=1171604099
以前曾经放弃这个问题了,但最近又看到了这样的问题,于是又想继续深究。jdk一直在升级,或许新版本能做到也说不定,但是我自己是搞不定了,所以恳请各位高手赐教,谢了。
在解决这个问题之前,我想先问一下,有什么方法能得到当前虚拟机里所有的对象,哪怕是得到堆栈中所有的对象也行?我觉得这个问题比较关键。
...全文
235 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolzyt 2007-11-16
  • 打赏
  • 举报
回复
光知道class显然是不行的,至少要得到对象了,才能用反射取得对象里的变量。
就现在的技术基础上,也未必不能解决,不过你要实现一个自己的容器,也就是实例管理,类似spring这样的就可以了,当从容器取出一个实例时维护一个弱引用的WeakHashMap保存当前容器里的所有实例的引用。像weblogic那种自己本身就是一个容器,估计是实现了自己的classloader,重写了构造方法吧。
yilinhust 2007-11-16
  • 打赏
  • 举报
回复
感觉不到有什么用!
qybao 2007-11-13
  • 打赏
  • 举报
回复
这个问题仅作为技术难点来讨论,至于有什么实际的意义,且搁下不谈。
这个问题确实不好解决,这个我很清楚,而且的理由里也说得很清楚,在现有的技术基础上应该是没法实现的。但是现在jdk一直在发展,现在已经开始慢慢提供很多获取jvm信息的手段了,比如java.lang.management包,JVMTI技术等等,所以我想将来是否有可能能做到这一点。其实像现在的垃圾回收机制,系统会在申请一块新内存时同时给该内存的引用计数器赋值,当该引用计数器为0,也就是没用对象再引用这块内存了,系统就会回收该内存。从该机制上看,系统在给引用计数器赋值时,同时保存一下变量名也并不是不可能的事,只是变量多了,保存变量名的集合就会增大,消耗很多内存,结果可能就会影响性能,所以编译器没必要做这些无谓的处理。但是并不代表今后不会改善。用过JRock(Weblogic)的JVM的,对JConsole等JRock提供的一些JVM性能监视的工具会觉得不错,该JVM的jvm.dll应该是被customize过的,所以,要自己改善JVM也并非不可能,所以这个问题也不是说完全不能解决,只是工程会很繁琐,而且也并非纯粹的java就能解决,底层的处理还是少不了的。
这个问题我以前就放弃了,但是一直没能解决心里总有个坑,所以多年后想再次讨论一下这个问题,希望每个都能说一下自己的想法,哪怕是假设也不错。
lzheng2001 2007-11-13
  • 打赏
  • 举报
回复
楼主你获取字符串的对象变量有什么实际意义吗?
olivesoup 2007-11-13
  • 打赏
  • 举报
回复
把你的意思理解错了,你这个可不好办呐。
单靠名称觉得不可行啊,你可以在不同地方创建相同名称的对象,
但他们在内存中地址肯定又不一样,java还要进行实时回收...
你说的那个觉得是条思路,可是该如何实现呢?
qybao 2007-11-13
  • 打赏
  • 举报
回复
LS的,你的结果不对,你是重新new一个出来的,并不是一开始生成的
A a = new A(1);
重新new一个出来的,谁都会,问题就是要找到原来那个
也就是通过字符串"xxx",获得xxx这个对象变量
即我上面的代码中,通过字符串"a",获得a这个对象变量,如果是通过class名而获得对象,那就不是什么希奇问题了。
所以,解决问题的关键,还是在于,有什么方法能得到当前虚拟机里所有的对象,哪怕是得到堆栈中所有的对象也行?
期待高手继续作答。



olivesoup 2007-11-13
  • 打赏
  • 举报
回复
在以前那个帖子里我说了只要知道Class就能得到变量,我把你写的代码补全了
一个是通过Class名得到Class对象,一个是通过Class和变量名得到变量

public class FindVariant {
public static void main(String[] args) {
FindVariant fv = new FindVariant();
A a = new A(1);
Object obj = fv.findByName(A.class.getName());
if (obj instanceof A) {
A aa = (A) obj;
aa.show();
if (aa == a) { //这里是判断找到的是不是想找的,如果是,引用地址应该是一样的
System.out.println("find the same variant. ");
}
}

Object obj2 = fv.findByClassNameAndName(A.class.getName(), "index");
System.out.println("index type is ==" + ((Field)obj2).getType());
// if (obj instanceof A) {
// A aa = (A) obj;
// aa.show();
// if (aa == a) {
// System.out.println("find the same variant. ");
// }
// }
}

public Object findByName(String name) {
//LZ如果真的解决了,能把你的处理补写完这个函数吗?

Class cls = null;
Object obj = null;
try {
cls = Class.forName(name);
Constructor ct = cls.getConstructor(int.class);
obj = ct.newInstance(1);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return obj;
}

public Object findByClassNameAndName(String className, String name) {
//就算你只知道class名,你又是怎么得到实际的变量的?也请你补写完这个函数好吗?
Field field;
Class cls = null;
try {
cls = Class.forName(className);
field = cls.getDeclaredField(name);
} catch (Exception e) {
e.printStackTrace();
return null;
}

return field;
}
}
xiyuan1999 2007-11-13
  • 打赏
  • 举报
回复
Up

62,610

社区成员

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

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