使用Java Reflection加载接口

时间:2013-03-19 09:43:20

标签: java reflection interface

有人可以指导我这个。我有一个类加载器,我可以使用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;
}

2 个答案:

答案 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;
}