2011-01-14 73 views
5

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

例如,让我们说,我有

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

现在我想借“C”,并用它来声明该类型的新对象。沿着这些方向的东西:

Class<c> my_new_var; 

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

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

由于提前,

布鲁诺

+0

这种动态弄虚作假甚至动态语言的阻碍。你为什么认为这是一个好主意? – delnan 2011-01-14 18:45:55

回答

2
YourType newObject = c.newInstance(); 

但是,你需要有一个无参数的构造函数。否则,你不得不做更多的思考。

请注意,如果参数化了Class,则不需要投射。如果不是,就像你的代码一样,你需要一个强制转换。

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

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

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

假设你的类有一个公共的无参数构造函数。 – biziclop 2011-01-14 18:44:05

+0

感谢Bozho。我明白c.newInstance()会给我一个与obj1相同类型的新对象;问题是,当声明newObject时,我仍然需要声明它为“YourType”,我假设除了通过“c”之外我不知道它。理想情况下,我会发现像类可以用作一个类型时声明一个新的变量 - 这样我可以做类 newObject = c.newInstance(),但我明白,这可能是不可能的,因为Java静态类型。我对吗?再次感谢! – Bruno 2011-01-15 01:56:09

0

像这样:

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

如果你有一个默认的构造函数:

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

my_new_varClass<SomeClass>类型,这是不一样的obj1这是SomeClass型的。

但是my_new_var.newInstance()确实会为您提供与obj1相同类型的新对象。

0

嗯,你可以这样做:

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

这需要SomeClassobj1实际上是任何一个子类无参数的构造函数(如果有的话)。

但是,这仅适用于您所知道的Class对象的类型。给定一些任意的原始ClassClass<?>对象,您不知道什么类型的对象newInstance()会返回,您只能将该实例声明为Object

0

对于我这种工作:

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