有人可以指导我这个。我有一个类加载器,我可以使用Java反射加载一个类。但是,无论如何我可以将我的对象转换为界面吗?我知道有一个ServiceLoader
,但我读到它是非常不推荐的。
//returns a class which implements IBorrowable
public static IBorrowable getBorrowable1()
{
IBorrowable a; //an interface
try
{
ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
a = (IBorrowable) myClassLoader.loadClass("entityclasses.Books");
}
catch (Exception e ){
System.out.println("error");
}
return null;
}
答案 0 :(得分:1)
我唯一可以看到你可能在这里做错的是使用系统类加载器。有可能无法看到您的实现类。
public static IBorrowable getBorrowable1() //returns a class which implements IBorrowable
{
IBorrowable a; //an interface
try
{
a = (IBorrowable) Class.forName("entityclasses.Books");
}
catch (Exception e ){
System.out.println("error");
}
return a;
}
强烈建议我放弃ServiceLoader
。
答案 1 :(得分:1)
看起来你错过了一个对象实例化。
myClassLoader.loadClass("entityclasses.Books")
不会返回IBorrowable
的实例,而是一个Class对象的实例,它引用Books。您需要使用newInstance()
方法
这是固定版本(假设,Books
具有默认构造函数)
public static IBorrowable getBorrowable1() //returns a class which implements IBorrowable
{
try {
ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
Class<IBorrowable> clazz = (IBorrowable) myClassLoader.loadClass("entityclasses.Books");
return clazz.newInstance();
} catch (Exception e) {
System.out.println("error");
}
return null;
}