我是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应该'被调用。
我怎样才能做到这一点?
答案 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");
}
}