声明Java对象,其类型/类名称为字符串

时间:2011-01-14 18:41:04

标签: java class casting

我想知道是否有可能在Java中声明某个给定类型的新对象,因为我将该类型表示为Class对象。

例如,让我们说我有

SomeClass obj1;
Class c = obj1.getClass();

现在我想取“c”并用它来声明该类型的新对象。这些方面的东西:

Class<c> my_new_var;

这样my_new_var就是与obj1相同类型/类的变量。我想,这与我们是否可以在新变量的声明中使用Class对象(或与该Class对象相关的东西)作为 type 直接相关。

这是可能的,还是不可能的,因为Java是强类型的?

提前致谢,

布鲁诺

7 个答案:

答案 0 :(得分:2)

YourType newObject = c.newInstance();

但是你需要一个无参数的构造函数。否则你必须做更多的反思。

请注意,如果您的Class已参数化,则无需进行投射。如果不是,就像你的代码一样,你需要一个演员。

对于你的第二个问题 - 不,不可能声明一个动态类型的变量,因为是的,java是静态类型的。您必须在编译时定义变量的类型。在上面的例子中,您可以:

  • 如果您不知道类型,请使用Object,因为它是所有对象的超类。
  • 使用泛型。例如(省略异常处理):

    public static <T> T createNewInstance(T exampleInstance) {
       return (T) exampleInstance.getClass().newInstance(); 
    }
    

答案 1 :(得分:1)

如果您有默认构造函数:

SomeClass obj2 = (SomeClass) c.newInstance();

答案 2 :(得分:0)

Yeap,试试:

a = c.newInstance();

答案 3 :(得分:0)

像这样:

Class c  = Class.forName("com.xyzws.SomeClass"); 
Object a = c.newInstance();

答案 4 :(得分:0)

my_new_var的类型为Class<SomeClass>,与类型为obj1的{​​{1}}不同。

但是SomeClass会为您提供一个与my_new_var.newInstance()类型相同的新对象。

答案 5 :(得分:0)

嗯,你可以这样做:

SomeClass obj1 = ...
Class<? extends SomeClass> c = obj1.getClass();
SomeClass obj2 = c.newInstance();

这需要SomeClass obj1的任何子类(如果有)的无参数构造函数。

但是,这只能起作用,因为您知道有问题的Class对象的类型。给定一些任意原始ClassClass<?>对象,您将不知道对象newInstance()将返回什么类型,并且您只能将该实例声明为Object

答案 6 :(得分:0)

对我来说这很有效:

Object innerObj = classObj.getClass().newInstance();