我想知道是否有可能在Java中声明某个给定类型的新对象,因为我将该类型表示为Class对象。
例如,让我们说我有
SomeClass obj1;
Class c = obj1.getClass();
现在我想取“c”并用它来声明该类型的新对象。这些方面的东西:
Class<c> my_new_var;
这样my_new_var就是与obj1相同类型/类的变量。我想,这与我们是否可以在新变量的声明中使用Class对象(或与该Class对象相关的东西)作为 type 直接相关。
这是可能的,还是不可能的,因为Java是强类型的?
提前致谢,
布鲁诺
答案 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
对象的类型。给定一些任意原始Class
或Class<?>
对象,您将不知道对象newInstance()
将返回什么类型,并且您只能将该实例声明为Object
。
答案 6 :(得分:0)
对我来说这很有效:
Object innerObj = classObj.getClass().newInstance();