获取匿名内部类的Class <! - ? - >对象

时间:2014-07-25 21:20:31

标签: java class anonymous-class

我有一个方法需要一个它将构造多次的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;
        });
    }
}

有没有办法做到这一点,还是我的系统有设计缺陷?如果是的话,我将如何实现呢?顺便说一下,我不能通过构造函数传递名称,因为构造函数必须为所有类提供相同的参数(因为它将使用反射构造)。

1 个答案:

答案 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());
    }

}