我有一个方法需要一个它将构造多次的Class对象:
Class<?> clazz = MyClass.class;
register(clazz);
对于某些寄存器,我想使用匿名类,但为此我需要一个Class<?>
对象。
我会用它来注册非常相似的多个类,但(在这个例子中)有不同的名称:
String[] nameList = { "name1", "name2" }; // and a lot more
for (final String name : nameList) {
// How would I do the next line?
// It is supposed to pass the Class<?> for an anonymous class overriding getName()
register(AnAnonymousClass {
@Override
public String getName() {
return name;
});
}
}
有没有办法做到这一点,还是我的系统有设计缺陷?如果是的话,我将如何实现呢?顺便说一下,我不能通过构造函数传递名称,因为构造函数必须为所有类提供相同的参数(因为它将使用反射构造)。
答案 0 :(得分:2)
我相信Peter Lawrey是对的,因为你不是在循环中创建不同的类,只有实例。
您需要“注册”自己的所有课程吗?如果是这样,您可以为它们创建一个包含复制方法的接口。您可以注册原始对象并复制它,而不是注册类和使用反射创建实例,如下所示:
// Interface with methods that all these classes have in common
interface MyClassInterface {
MyClassInterface copy();
String getName();
}
@Test
public void testMyClasses() {
List<String> names = new ArrayList<>();
// Example list of names
names.add("adam");
names.add("ben");
names.add("carl");
List<MyClassInterface> objects = new ArrayList<>();
// Define specialized class with special implementation of getName
class MyClassWithName implements MyClassInterface {
private String name;
public MyClassWithName(String name) {
this.name = name;
}
@Override
public MyClassInterface copy() {
return new MyClassWithName(name);
}
@Override
public String getName() {
return name;
}
}
for (final String name: names) {
// "register" object
objects.add(new MyClassWithName(name));
}
for (MyClassInterface object: objects) {
System.out.println("original name " + object.getName());
// Construct copies as needed
MyClassInterface object2 = object.copy();
System.out.println("copy name " + object2.getName());
}
}