如题,例如Class MyClass
{
String name;
public void setName(String s)
{
this.name=s;
} public String getName()
{
return this.s;
}}public class TMain
{ public static void main(String args[])
{
MyClass myclass=new MyClass();
myclass.setName("Terry");
System.out.println("hashcode:"+myclass.hashcode());
MyClass myclass1=getClassFromHashCode(myclass.hascode()); //通过hashcode重新得到这个对象
System.out.println("name:"+myclass1.getName());//这里应该显示出Terry
} public static Object getClassFromHashCode(int hascode)
{
//就是这个方法不知怎么写
}}能解决的,我加分再结贴。谢谢
{
String name;
public void setName(String s)
{
this.name=s;
} public String getName()
{
return this.s;
}}public class TMain
{ public static void main(String args[])
{
MyClass myclass=new MyClass();
myclass.setName("Terry");
System.out.println("hashcode:"+myclass.hashcode());
MyClass myclass1=getClassFromHashCode(myclass.hascode()); //通过hashcode重新得到这个对象
System.out.println("name:"+myclass1.getName());//这里应该显示出Terry
} public static Object getClassFromHashCode(int hascode)
{
//就是这个方法不知怎么写
}}能解决的,我加分再结贴。谢谢
private final static Map<Integer,XObject> map=Collections.synchronizedMap(new HashMap<Integer,XObject>());
public static XObject getObjectByRawHashCode(Integer hashCode){
return map.get(hashCode);
}
XObject(){
map.put(System.identityHashCode(this),this);
}
}
class MyClass extends XObject
{
String name;
public void setName(String s)
{
this.name=s;
} public String getName()
{
return this.name;
}}
main: MyClass myclass=new MyClass();
myclass.setName("Terry");
System.out.println("hashcode:"+myclass.hashCode());
MyClass myclass1=(MyClass) XObject.getObjectByRawHashCode(myclass.hashCode()); //通过hashcode重新得到这个对象
System.out.println("name:"+myclass1.getName());//这里应该显示出Terry
你的这个方法是要预先定义好才能得到的,如果里面数据有变化,那么hashcode肯定会变化,这个时候你又取不出来了
所以,应该不能用你的那种方法来从 hashcode取出对象
抱歉了,兄弟!
=======
你的问题在JAVA DOC中有答案,Object类的hashCode()方法里面有这个方法的详细说明。
我英文不好,就不给你翻译了,你自己看看吧。
你错了,我看清楚了你的问题才说那句话的。你题目中的类MyClass没有继承,那么就是继承自JAVA的Object。因此你所说的hashCode就是Object的hashCode。
关于Object的hashCode,在JAVA DOC中,有这段话:
* As much as is reasonably practical, the hashCode method defined by
* class <tt>Object</tt> does return distinct integers for distinct
* objects. (This is typically implemented by converting the internal
* address of the object into an integer, but this implementation
* technique is not required by the
* Java<font size="-2"><sup>TM</sup></font> programming language.)
也就是说:Object的hashCode,(一般)是根据对象的内部地址(internal address)转化(计算)而来的。
从理论上(我说的是理论上,而实际上除非你非常深入了解JVM),如果我们如果找到了这个内部地址,那么我们还是有办法取回对象的。可是这个算法可能(我是说可能,我也没看过源码)是不可逆的,也就是说,你不一定能通过hashCode反算出internal address。当然现在唯一的一条路就显示出来了:
1、java的hashCode算法必须可逆
2、有办法把变量myclass1刷成你得到的internal address=============
我说的“汗,狂汗”没有别的意思,也不是为了捞分!(没见过接分的这么说话的吧)
我只是感叹于你写的“搞了几年开发”
我个人认为“搞了几年开发”的技术人员不可能不知道上面的内容。
直接似乎是不行的
public MyClassFactory{
static Map<Integer,MyClass> map=new HashMap<Integer,MyClass>();
private MyClassFactory(){}
public synchronized static MyClass getInstance(){
MyClass m=new MyClass();
map.put(m.hashCode(),m);
return m;
}
public synchronized static Object getClassFromHashCode(int hascode){
return map.get(new Integer(hashCode));
}
}在你每次需要MyClass对象的时候,不要new,而是这样:
MyClass myclass=MyClassFactory.getInstance();
然后你就可以:
MyClass myclass2=MyClassFactory.getClassFromHashCode(myclass.hashCode());
只要自己写一个java.lang.Object.java,重新定义一些方法,要么重新打包rt.jar里面
要么启动的时候放到bootclasspath前面,这样引导类加载器就会加载你实现的Object,
儿忽略掉rt.jar中的Object(不过这个参数不是标准参数)
java -Xboolclasspath/p myobject.jar
你去研究一下,就不会滔滔江水了~~
{
public int hashCode();
}@Aspect
public class HashCodeImpl implements HashCode
{ public int hashCode()
{
//...在这里将对象和它的hasCode值进行缓存
} @DeclareParents ( value = "foo.MyClass1" , defaultImpl = HashCodeImpl.class )
//这时的foo.MyClass是需要通过hasCode来获取原对象的类
private HashCode h1 ; //如果有多个类需要处理,如下添加
@DeclareParents ( value = "foo.MyClass2" , defaultImpl = HashCodeImpl.class )
private HashCode h2 ; ....}
使用AspectJ编译(可以是jar或java文件)后就可以只对需要的类进行这样的处理,
此方法对原代码没有任何改变