将对象使用Object类中的toString方法转为字符串后是否可以再转回对象?
首先,内存地址这个东西是一直在变的,下面有解释,所以,此为伪需求。
其次,可以在toString()后的字符串里截取到完整类名,使用反射创建一个新的对象,伪需求。
所以,大佬可以撤了 :)
toString方法(原始的,Object类中的)
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
No1: 获取完整类名 getClass.getName()
new PageDao().getClass.getName() 结果为:
cn.com.senbon.dao.pageDao.PageDao
No2: 拼接@符号
分隔符,该符号后面为16进制的无符号字符串表示的哈希编码
No3:
Integer.toHexString(new Page().hashCode())
hashCode:获取该对象的哈希编码,纯数字。(将内存地址转为整数)
Integer.toHexString(int):将整数转换为16进制的无符号字符串
PageDao pd=new PageDao();
pd.toString();
//获得的结果应当为:
//PageDao的完整类名+标识符“@”+该对象的哈希编码的十六进制字符串
输出结果:
hashCode()返回的结果(不一定)是内存地址(虚拟),具体情况取决于运行时库于JVM的具体实现
如果把对象toString后,是否能截取该对象的内存地址重新提取出该对象?
The 1:
关于内存地址变动:
首先,垃圾回收(GC)是会改变内存位置的,其次:
PageDao pd=new PageDao();
pd.hashCode();//哈希码:8860464
============================
在pd对象创建之前,new上一个新的PageDao。
PageDao pd1=new PageDao
pd1.hashCode(); //哈希码:8860464
PageDao pd=new PageDao();
pd.hashCode();//哈希码:27095111
内存地址发生了变动,所以,无法依内存地址来提取对象
如果把对象toString后,是否能使用该字符串创建对象?
No 1里已经解释了:
toString方法第一步:获取完整类名
既然他是固定符号(@)拼接的,那么 ,我们也可以将他截取出来
//创建PageDao对象
PageDao pd=new PageDao();
//将该对象转换为字符串
String pdStr=pd.toString();
//截取到完整类名(@符号之前的所有字符)
String pdName= pdStr.substring(0,pdStr.indexOf("@"));
//加载到该类(反射),并调用newInstance()方法创建对象
PageDao pd2=(PageDao) Class.forName(pdName).newInstance();
Ps:forName需要进行异常处理(try-catch),略过
上一篇: python备忘录
下一篇: Android帧动画无效解决方案