实例化使用反射实现特定接口的Java类
我不习惯思考。我看过一些问题和教程 假设我有一个接口,由3个类A、B、C实现实例化使用反射实现特定接口的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
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");
}
}