Java 如何动态实例化在运行时决定类型的类
让我们假设我有三个类:Java 如何动态实例化在运行时决定类型的类,java,Java,让我们假设我有三个类:类B,类C,和类D。这三个类都是A类的子类 我不知道类a的哪个子级需要在运行时实例化。我已经研究了Class.forName()及其伴随函数newInstance(),但当我尝试并实际使用它们时,我会生成不兼容类型错误。这很有意义,因为对象不能直接转换为自定义类 以下是我目前正在做的事情: public A build(String className, int[] properties) { Class clasz = Class.forName(classN
类B
,类C
,和类D
。这三个类都是A类
的子类
我不知道类a的哪个子级需要在运行时实例化。我已经研究了Class.forName()及其伴随函数newInstance(),但当我尝试并实际使用它们时,我会生成不兼容类型
错误。这很有意义,因为对象不能直接转换为自定义类
以下是我目前正在做的事情:
public A build(String className, int[] properties) {
Class clasz = Class.forName(className);
A a = clasz.newInstance();
a.setProperties(properties);
return a;
}
我的代码假设className只包含类A的子类的值。在我看到的示例中,作者将newInstance()的结果强制转换为他们想要的类。也就是说,我不能这样做,因为我不知道我正在实例化哪个类
我觉得我可能遗漏了一些关于这些方法的目的和功能的关键信息。请帮助我理解我做错了什么
谢谢。假设我们有以下课程:
public class A {}
public class B extends A {}
public class C extends B {}
示例:
public static void main(String[] args) throws Exception {
System.out.println(getInstance(C.class) instanceof C); // True
System.out.println(getInstance(C.class) instanceof B); // True
System.out.println(getInstance(C.class) instanceof A); // True
System.out.println(getInstance(C.class.getName()) instanceof C); // True
System.out.println(getInstance(C.class.getName()) instanceof B); // True
System.out.println(getInstance(C.class.getName()) instanceof A); // True
}
public static <T extends A> T getInstance(Class<T> tClass) throws Exception {
Constructor<T> constructor = tClass.getConstructor();
return constructor.newInstance();
}
public static Object getInstance(String className) throws Exception {
Class<?> clazz = Class.forName(className);
Constructor<?> constructor = clazz.getConstructor();
return constructor.newInstance();
}
publicstaticvoidmain(字符串[]args)引发异常{
System.out.println(getInstance(C.class)instanceof C);//True
System.out.println(getInstance(C.class)instanceof B);//True
System.out.println(getInstance(C.class)instanceof A);//True
System.out.println(getInstance(C.class.getName())instanceof C);//True
System.out.println(getInstance(C.class.getName())instanceof B);//True
System.out.println(getInstance(C.class.getName())instanceof A);//True
}
公共静态T getInstance(类tClass)引发异常{
Constructor=tClass.getConstructor();
返回构造函数.newInstance();
}
公共静态对象getInstance(字符串类名称)引发异常{
Class clazz=Class.forName(className);
Constructor=clazz.getConstructor();
返回构造函数.newInstance();
}
假设我们有这样的类:
public class A {}
public class B extends A {}
public class C extends B {}
示例:
public static void main(String[] args) throws Exception {
System.out.println(getInstance(C.class) instanceof C); // True
System.out.println(getInstance(C.class) instanceof B); // True
System.out.println(getInstance(C.class) instanceof A); // True
System.out.println(getInstance(C.class.getName()) instanceof C); // True
System.out.println(getInstance(C.class.getName()) instanceof B); // True
System.out.println(getInstance(C.class.getName()) instanceof A); // True
}
public static <T extends A> T getInstance(Class<T> tClass) throws Exception {
Constructor<T> constructor = tClass.getConstructor();
return constructor.newInstance();
}
public static Object getInstance(String className) throws Exception {
Class<?> clazz = Class.forName(className);
Constructor<?> constructor = clazz.getConstructor();
return constructor.newInstance();
}
publicstaticvoidmain(字符串[]args)引发异常{
System.out.println(getInstance(C.class)instanceof C);//True
System.out.println(getInstance(C.class)instanceof B);//True
System.out.println(getInstance(C.class)instanceof A);//True
System.out.println(getInstance(C.class.getName())instanceof C);//True
System.out.println(getInstance(C.class.getName())instanceof B);//True
System.out.println(getInstance(C.class.getName())instanceof A);//True
}
公共静态T getInstance(类tClass)引发异常{
Constructor=tClass.getConstructor();
返回构造函数.newInstance();
}
公共静态对象getInstance(字符串类名称)引发异常{
Class clazz=Class.forName(className);
Constructor=clazz.getConstructor();
返回构造函数.newInstance();
}
如评论中所述,您应该向并返回A
:
public生成(字符串className,int[]属性)抛出ClassNotFoundException、NoSuchMethodException、InstanceionException、IllegalAccessException、InvocationTargetException{
Class clasz=Class.forName(className);
A=(A)clasz.getDeclaredConstructor().newInstance();
a、 设置属性(属性);
返回a;
}
看一个演示
还要注意,您应该在clasz
(Class clasz
)的声明中提供一个类型参数,以避免出现警告。而java.lang.Class
中的newInstance()
方法从版本9开始就被弃用了。发件人:
已弃用。此方法传播nullary构造函数引发的任何异常,包括选中的异常。使用此方法可以有效地绕过编译时异常检查,否则将由编译器执行。newInstance方法通过将构造函数引发的任何异常包装到(选中的)InvocationTargetException中来避免此问题
电话
clazz.newInstance()
可以用
clazz.getDeclaredConstructor().newInstance()
如评论中所述,您应该强制转换到并返回
A
:
public生成(字符串className,int[]属性)抛出ClassNotFoundException、NoSuchMethodException、InstanceionException、IllegalAccessException、InvocationTargetException{
Class clasz=Class.forName(className);
A=(A)clasz.getDeclaredConstructor().newInstance();
a、 设置属性(属性);
返回a;
}
看一个演示
还要注意,您应该在clasz
(Class clasz
)的声明中提供一个类型参数,以避免出现警告。而java.lang.Class
中的newInstance()
方法从版本9开始就被弃用了。发件人:
已弃用。此方法传播nullary构造函数引发的任何异常,包括选中的异常。使用此方法可以有效地绕过编译时异常检查,否则将由编译器执行。newInstance方法通过将构造函数引发的任何异常包装到(选中的)InvocationTargetException中来避免此问题
电话
clazz.newInstance()
可以用
clazz.getDeclaredConstructor().newInstance()
如果它们是
A
的子对象,您应该能够对其进行强制转换:A=(A)clasz.newInstance()我假设build
返回A
,而不是Effect
(不管是什么),如果它们是A
的子对象,您应该能够对其进行强制转换:A=(A)clasz.newInstance()我假设build
返回A
,而不是Effect
(不管是什么)为什么System.out.println(getInstance(C.class)instanceof B)代码>真的?我错了,我