欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将对象使用Object类中的toString方法转为字符串后是否可以再转回对象?

程序员文章站 2024-03-23 23:11:52
...

首先,内存地址这个东西是一直在变的,下面有解释,所以,此为伪需求

其次,可以在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的完整类名+标识符“@”+该对象的哈希编码的十六进制字符串

 

输出结果:

[email protected]

      

         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),略过

 

 

 

相关标签: 伪需求