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]();
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
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();
4条答案
按热度按时间5ssjco0h1#
在Java中,可以使用以下语法创建类引用数组
并使用newInstance()按如下方式访问它们
您可以在这里找到文档:https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
qcbq4gxm2#
我建议使用无参数的默认构造函数来创建给定
Class
的新示例,因为Class#newInstance
方法从Java 9开始就被弃用了。请记住,它使用的反射引擎盖下,这是相当缓慢的,应该避免,如果可能的话。也许你想透露你试图达到的目标。数组声明和用法都很简单,但我推荐使用
List<Class<?>>
:...或者一个电话:
v09wglhw3#
我认为反射的例子看起来很合理:
但我认为这可以通过使用
Supplier
而不是使用反射来改进:我发现它更灵活,更支持OOP。
jxct1oxe4#
一个更 * 功能性 * 的方法,不使用反射。
A::new
是对无参数构造函数的方法引用;类似于lambda表达式
() -> new A()
。