将String转换为Class对象

时间:2011-03-23 06:10:51

标签: java string object

我使用toString()方法将类对象存储到字符串中。现在,我想将字符串转换为该类对象。

怎么做?请帮我提供源代码。

9 个答案:

答案 0 :(得分:26)

  

我使用toString()方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。

你的问题很模糊。这可能意味着至少有两件不同的事情,其中​​之一就是......嗯......你这是一个严重的误解。


如果你这样做了:

SomeClass object = ...
String s = object.toString();

然后答案是没有简单的方法可以将s转回SomeClass的实例。即使toString()方法给你一个时髦的“SomeClass @ xxxxxxxx”字符串,你也无法做到。 (该字符串不编码对象的状态,甚至不编码对象的引用.xxxxxxxx部分是对象的身份哈希码。它不是唯一的,不能神奇地转回参考对象。)

toString的输出转换回对象的唯一方法是:

  • SomeClass.toString()方法进行编码,以便在其生成的String中包含对象的所有相关状态,并
  • 编码以toString()方法生成的格式显式解析字符串的构造函数或工厂方法。

这可能是一个糟糕的方法。当然,要为非平凡的课程做这件事需要做很多工作。


如果你做了这样的事情:

SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();

然后您可以返回相同的Class对象(即c中的对象),如下所示:

Class c2 = Class.forName(cn);

这为您提供Class,但没有神奇的方法可以使用它重建原始实例。 (显然,类的名称不包含对象的状态。)


如果您正在寻找一种方法来序列化/反序列化任意对象,而不需要自己编写解码/解析方法,那么不应该完全使用toString()方法。以下是您可以使用的一些替代方案:

  • Java对象序列化API,如@Nishant的答案中的链接所述。
  • @ fatnjazzy的回答中描述的JSON序列化。
  • 像XStream这样的XML序列化库。
  • ORM映射。

这些方法中的每一种都有优点和缺点......我不会在这里讨论。

答案 1 :(得分:17)

更简单的方法: 您将需要com.google.gson.Gson将对象转换为流式传输的json字符串

将对象转换为json字符串,以便在代码

下使用流式传输
Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);

要在代码下面将json字符串转换回对象:

Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);

在另一方面转换对象以进行流式传输和读取的更简单方法。 希望这可以帮助。 - 维斯什

答案 2 :(得分:6)

Class.forName(nameString).newInstance();

答案 3 :(得分:2)

  

我使用toString()方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。

首先,如果我理解你的问题,你想将你的对象存储到一个字符串中,然后再次读取它并重新创建对象。

就个人而言,当我需要这样做时,我使用ObjectOutputStream。但是,有一个强制性条件。要转换为String然后再转换为Object的对象必须是Serializable对象及其所有属性。

让我们考虑ReadWriteObject,操纵对象和ReadWriteTest操纵者。

我将如何做到这一点:

public class ReadWriteObject implements Serializable {

    /** Serial Version UID */
    private static final long serialVersionUID = 8008750006656191706L;

    private int age;
    private String firstName;
    private String lastName;

    /**
     * @param age
     * @param firstName
     * @param lastName
     */
    public ReadWriteObject(int age, String firstName, String lastName) {
        super();
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "ReadWriteObject [age=" + age + ", firstName=" + firstName + ", lastName=" + lastName + "]";
    }

}


public class ReadWriteTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // Create Object to write and then to read
        // This object must be Serializable, and all its subobjects as well
        ReadWriteObject inputObject = new ReadWriteObject(18, "John", "Doe");

        // Read Write Object test

        // Write Object into a Byte Array
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(inputObject);
        byte[] rawData = baos.toByteArray();
        String rawString = new String(rawData);
        System.out.println(rawString);

        // Read Object from the Byte Array
        byte[] byteArrayFromString = rawString.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayFromString);
        ObjectInputStream ois = new ObjectInputStream(bais);
        Object outputObject = ois.readObject();
        System.out.println(outputObject);
    }
}

标准输出与此类似(实际上,我无法复制/粘贴它):

¬í ?sr ?*com.ajoumady.stackoverflow.ReadWriteObjecto$˲é¦LÚ ?I ?ageL ?firstNamet ?Ljava/lang/String;L ?lastNameq ~ ?xp ?t ?John ?Doe

ReadWriteObject [age=18, firstName=John, lastName=Doe]

答案 4 :(得分:1)

你可能想用json做这件事 然后将你的bean(*)转换为json 这个过程被称为序列化和反序列化 阅读它here

(*)不要只使用成员作为数据源,为对象中的每个成员构建getter和setter。

答案 5 :(得分:1)

正如其他人所说,你的问题充其量是模棱两可的。问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。

但是,请注意,虽然Java中的许多对象类型都有字符串表示形式,但这并不能保证可以从字符串表示形式构造对象。

引用this source

  

对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。

所以,你知道,你想要的可能是不可能的。但是可以将对象的状态保存为字节序列,然后从该字节序列重构它。

答案 6 :(得分:0)

继续发表评论。 toString不是解决方案。一些好的灵魂已经为Java中的对象的序列化和反序列化编写了完整的代码。见这里:http://www.javabeginner.com/uncategorized/java-serialization

建议阅读:

  1. 古老而善良Java Technical Article on Serialization
  2. http://java.sun.com/developer/technicalArticles/ALT/serialization/
  3. http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html

答案 7 :(得分:0)

您无法使用toString()将类对象存储到字符串中,toString()仅以您想要的任何方式返回对象的String表示形式。您可能想要阅读Serialization

答案 8 :(得分:0)

您可以使用以下声明: -

Class c = s.getClass();

获取类实例。