实例化使用反射实现特定接口的Java类

时间:2013-02-04 05:36:28

标签: java class reflection interface

我是Reflection的新手。我看过一些问题和教程。

假设我有一个接口由3个类A,B,C

实现
public interface MyInterface {
doJob();

}

现在使用反射我想调用每个类

Class<?> processor = Class.forName("com.foo.A");
Object myclass = processor.newInstance();

我不能将整个过程限制为特定类型,而不是创建一个Object。 我只想调用 MyInterface 类型类。

如果我传递com.foo.A它应该创建一个类对象,com.foo.B应该做B类对象,但是如果我传递一些com.foo.D谁存在但仍然没有实现MyInterface应该'被调用。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:6)

MyInterface newInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    Class<?> cls = Class.forName(className);
    if (!MyInterface.class.isAssignableFrom(cls)) {
        throw new IllegalArgumentException();
    }
    return (MyInterface) cls.newInstance();
}

答案 1 :(得分:2)

嗯,Java Reflection是一种通用机制,所以如果你只使用你在问题中提出的代码,就没有办法实现你想要实现的目标。 它就像询问如何限制类型的创建对象的Java而不是那些实现'MyInterface'的Java。 Java的“新”是通用的,它允许创建任何你想要的对象。

通常,您可以为此编写自己的代码。 而不是直接打电话

Class.forName

调用您自己的代码

您可以在编译时/运行时实现类似的东西。

编译类型检查示例(您需要创建一个Class对象):

public T newInstance(Class<T extends MyInterface cl) {
  return cl.newInstance();
}  

运行时示例已由Evgeniy Dorofeev发布

希望这有帮助

答案 2 :(得分:0)

尝试以下代码

 package com.rais.test;

public class Client {

    public static void main(String[] args) {
        try {
            System.out.println(createObject("com.rais.test.A"));
            System.out.println(createObject("com.rais.test.D"));

        } catch (Exception e) {
            e.printStackTrace();
        }
}

public static MyInterface createObject(String className)
        throws ClassNotFoundException, InstantiationException,
        IllegalAccessException {

    Class<?> clazz = Class.forName(className);

    if (MyInterface.class.isAssignableFrom(clazz)) {
        return (MyInterface) clazz.newInstance();

    } else {

        throw new RuntimeException(
                "Invalid class: class should be child of MyInterface");
    }

}