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

实例化使用反射实现特定接口的Java类,java,class,reflection,interface,Java,Class,Reflection,Interface,我不习惯思考。我看过一些问题和教程 假设我有一个接口,由3个类A、B、C实现 public interface MyInterface { doJob(); } 现在使用反射,我想调用每个类 Class<?> processor = Class.forName("com.foo.A"); Object myclass = processor.newInstance(); Class processor=Class.forName(“com.foo.A”); 对象myclass=p

我不习惯思考。我看过一些问题和教程

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

public interface MyInterface {
doJob();
}

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

Class<?> processor = Class.forName("com.foo.A");
Object myclass = processor.newInstance();
Class processor=Class.forName(“com.foo.A”);
对象myclass=processor.newInstance();
我不能将整个过程限制为特定类型,而不是创建对象。 我只想调用MyInterface类型类

如果我传递com.foo.A,它应该创建一个类对象,com.foo.B应该执行B类对象,但是如果我传递了一些存在但仍然没有实现MyInterface的com.foo.D,就不应该被调用

我怎样才能做到这一点呢?

试试看

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();
}
MyInterface newInstance(字符串className)抛出ClassNotFoundException、InstanceionException、IllegaAccessException{
Class cls=Class.forName(className);
如果(!MyInterface.class.isAssignableFrom(cls)){
抛出新的IllegalArgumentException();
}
return(MyInterface)cls.newInstance();
}

好吧,Java反射是一种通用机制,因此如果只使用问题中介绍的代码,就无法实现您想要实现的目标。 这与询问如何限制Java创建除实现“MyInterface”之外的其他类型的对象完全一样。Java的“新”是通用的,它允许创建您想要的任何对象

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

Class.forName
调用您自己的代码

您可以在编译时/运行时实现类似的功能

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

public T新实例(类请尝试下面的代码

 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");
    }

}
package com.rais.test;
公共类客户端{
公共静态void main(字符串[]args){
试一试{
System.out.println(createObject(“com.rais.test.A”);
System.out.println(createObject(“com.rais.test.D”);
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态MyInterface createObject(字符串类名称)
抛出ClassNotFoundException、实例化Exception、,
非法访问例外{
Class clazz=Class.forName(className);
if(MyInterface.class.isAssignableFrom(clazz)){
return(MyInterface)clazz.newInstance();
}否则{
抛出新的运行时异常(
“无效类:类应为MyInterface的子类”);
}
}
检查此链接。。。。。。
 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");
    }

}