Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态实例化在运行时决定类型的类_Java - Fatal编程技术网

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)真的?我错了,我