2013-02-04 190 views
3

我是Reflection的新手。我看过一些问题和教程。实例化使用反射实现特定接口的Java类

假设我有一个接口,其真实由3 类A,B实施,C

public interface MyInterface { 
doJob(); 

}

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

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

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

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

我该如何做到这一点?

+1

检查此链接...... http://stackoverflow.com/questions/492184/how-do-you-fi ND-所有亚类对的一给出的级合的java – sunleo

回答

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

那么,Java反射是一个通用的机制,所以如果你只使用你在问题中提供的代码,是没有办法达到你想达到的目标。 就像询问如何限制Java创建其他类型的对象比实现'MyInterface'的类型。 Java的'新'是通用的,它将允许创建你想要的任何对象。

一般而言,您可以为此编写自己的代码。 而不是调用直接

Class.forName 

打电话给你自己的代码

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

举例编译类型检查(你需要创建一个类对象):

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

的运行实例被张贴叶夫根尼·Dorofeev已经

希望这有助于

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

}