java 如何在数组中存储不同类类型的引用

nnsrf1az  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(154)

我想在数组中存储对类(而不是对象)的引用,这样我就可以使用它来创建不同类型的多个对象。例如,在一个实施例中,

class A;
class B;
class C;

array_of_classes = [A, B, C]; // How do I write this?

// Such that I can use it like this
Object a = new array_of_classes[0]();
5ssjco0h

5ssjco0h1#

在Java中,可以使用以下语法创建类引用数组

Class<?>[] arrayOfClasses = {A.class, B.class, C.class};

并使用newInstance()按如下方式访问它们

Object a = arrayOfClasses[0].newInstance();

您可以在这里找到文档:https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

qcbq4gxm

qcbq4gxm2#

我建议使用无参数的默认构造函数来创建给定Class的新示例,因为Class#newInstance方法从Java 9开始就被弃用了。请记住,它使用的反射引擎盖下,这是相当缓慢的,应该避免,如果可能的话。也许你想透露你试图达到的目标。

private static Object newInstance(final Class<?> type) {
    try {
        Object object = type.getDeclaredConstructor().newInstance();
        System.out.println("Created a new instance of " + object.getClass());
        return object;
    } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
static class A {}
static class B {}
static class C {}

数组声明和用法都很简单,但我推荐使用List<Class<?>>

List<Class<?>> classes = List.of(A.class, B.class, C.class);
List<Object> list = classes.stream().map(Application::newInstance).toList();
Created a new instance of class com.company.Application$A
Created a new instance of class com.company.Application$B
Created a new instance of class com.company.Application$C

...或者一个电话:

Object object = newInstance(classes.get(0));
Created a new instance of class com.company.Application$A
v09wglhw

v09wglhw3#

我认为反射的例子看起来很合理:

List<Class<?>> classes = List.of(A.class, B.class, C.class);

for(Class<?> clazz : classes)
    Object obj = clazz.newInstance();

但我认为这可以通过使用Supplier而不是使用反射来改进:

List<Supplier<Object>> suppliers = List.of(A::new, B::new, C::new);

for(Supplier<Object> supplier : suppliers)
    Object obj = supplier.get();

我发现它更灵活,更支持OOP。

jxct1oxe

jxct1oxe4#

一个更 * 功能性 * 的方法,不使用反射。

class A {}
class B {}
class C {}

Supplier<?>[] arrayOfSupplier = { A::new, B::new, C::new };
// or
Supplier<?>[] arrayOfSupplier = { () -> new A(), () -> new B(), () -> new C() };
    
Object a = arrayOfSupplier[0].get();

A::new是对无参数构造函数的方法引用;
类似于lambda表达式() -> new A()

相关问题