0

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

2 回答 2

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,强烈推荐。

于 2013-03-19T09:52:57.343 回答
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;
}
于 2013-03-19T09:58:51.067 回答