【问题标题】:How to do type conversion by string?如何通过字符串进行类型转换?
【发布时间】:2015-03-18 20:20:16
【问题描述】:

我的类类型保存在这样的字符串中:

String cls = "Test";

这是我尝试过的一些代码:

String cls = "Test";

Object obj = new Test();

Test test = (Class.forName(cls)) obj;

但它以编译错误结束:

Main.java:21: error: ';' expected
        Test test = (Class.forName(cls)) obj;

如何使用这个字符串进行类型转换?

PS:假设我不知道obj 是什么类型,我只有String cls

【问题讨论】:

  • 将 Class Test 区分为一个对象(或产生它的表达式)和字符串 Test 为用 Java 程序编写的 4 个字母的序列。这两者之间存在世界。
  • 我知道,但是我如何在类中转换字符串,有没有像com.package.Test这样的字符串中的类全名选项?
  • 您在左侧声明 test 为“Test”类型。因此,此时在您的程序中,您知道要强制转换为 Test 类型。我认为这是让人们感到困惑的地方。您希望使用字符串动态设置强制转换,但在编译时您已经知道您期望的类型。
  • @darrenmc 也许我用了错误的例子,但这正是我想要的。使用带有类名的字符串动态转换对象。

标签: java type-conversion


【解决方案1】:

如果你想实例化一个你有名字的类,你已经在正确的轨道上:

// Remember that this class name tells us, it's in the default package, 
// otherwise you would have to use the fully qualified name, for example
// com.mydomain.Test

String className = "Test";

// First we need to get the correct class object

Class<?> clz = Class.forName(className);

// And from this class object, we can create a new instance, in other
// words, a "Test" object:

Test test = (Test)clz.newInstance();

当然,有一些异常必须被捕获(或声明)等。但我想你明白了。如果您不想调用“Test”类的默认构造函数(没有参数的构造函数,换句话说,相当于 new Test() ),则必须通过 Class 对象的适当方法搜索正确的构造函数(getDeclaredConstructor 等 - 请参阅 API 文档)。

【讨论】:

  • 这是一个很好的答案,但是假设我有一个对象,但不知道它是什么类,我们将这个类名保存在字符串中。如何将字符串转换为 Class 并使用它进行转换。
  • 我不确定你的要求是什么,对不起...你能澄清你的问题,告诉我们你最终想要完成什么吗?
【解决方案2】:

您可以在从字符串创建的类上使用 cast 方法:

String className = "Test";
Class<?> clz = Class.forName(className);
clz.cast(objectToBecasted);

【讨论】:

  • 谢谢,这正是我需要的。
  • @Zlopez ,去检查一下这个 Demo ,你会得到编译错误,因为你需要再次显式转换它!
  • 谢谢,我没试过。在不知道类类型或对可能的类类型使用instanceof 然后强制转换的情况下,似乎没有选择?
  • 你想达到什么目的?因为您想使用不同的编译时类型而进行强制转换意味着您知道该类型。我看到的唯一其他选择是泛型,当您将类型作为参数传递给方法时。另见this question
【解决方案3】:

java.lang.class.Class c=Class.forName("ClassNameToBeLoadedDynamically") 不是必需的,因为

调用 Class.forName("X") 会使名为 X 的类成为 动态加载(在运行时)。

可以直接使用

Test test = (Test) obj;

【讨论】:

  • 他想用他的字符串“铸造”!
  • @BenWin 否:他想使用 Class 类型的表达式进行转换!
  • @laune 你误解了我的评论:他不想使用像 Neeraj 提供的明确演员表。
【解决方案4】:

好的,

试试这个:

Test test = (Test) Class.forName(cls).cast(obj);

【讨论】:

  • 但假设我知道 obj 是什么类,但假设我不知道并且这个类名只保存在字符串中。
  • 抱歉听不懂,能否改写一下?
  • 我不知道obj是否是类类型Test,但我有类名保存在String cls
  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • @AlbertoZaccagni 什么?是写给我的吗?
【解决方案5】:
    String cls = "Test";

    Test t = new Test();

    OtherTest ot = new OtherTest();

    Class<?> c = Class.forName(cls);

    if(t.getClass() == c) {
        System.out.println("Hooray!");
    }

    if(ot.getClass() == c) {
        System.out.println("Mmmmh");
    }

它打印出“万岁”

这是你想要的吗?

【讨论】:

  • 不,他不想比较类,他真的想把它扔掉!!!
  • 是的,但是在转换未知对象之前,您应该检查该类是否匹配,否则您将招致 ClassCastException ...这是我之前回答的补充。我应该把它们捆绑在一起,我知道。
  • @Johny,那么您可能应该编辑您以前的答案并仅在此处添加。给出多个答案没有意义
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2013-05-15
  • 2014-12-08
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多