Java 返回接口而不是类<;界面>;

Java 返回接口而不是类<;界面>;,java,class,casting,classloader,Java,Class,Casting,Classloader,我编写了自己的类加载器,它与类一起工作,实现接口插件。但我不能将类转换为插件。怎么了 public Plugin load(String pluginName, String pluginClassName) { SimpleClassLoader system = new SimpleClassLoader(); system.setClassName(pluginClassName); Plugin aClass = null;

我编写了自己的类加载器,它与类一起工作,实现接口插件。但我不能将类转换为插件。怎么了

public Plugin load(String pluginName, String pluginClassName) {
        SimpleClassLoader system = new SimpleClassLoader();
        system.setClassName(pluginClassName);
        Plugin aClass = null;
        try {
            aClass = (Plugin) system.loadClass(pluginRootDirectory + pluginName + "\\" + pluginClassName + ".class");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return aClass;
    }
错误:(18,47)java:不兼容的类型:java.lang.Class无法转换为插件

我补充说,这是我的SimpleClassLoader类的主要部分,它扩展了ClassLoader

@Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] bytes;
        try {
            bytes = Files.readAllBytes(new File(name).toPath());
        } catch (IOException e) {
            throw new ClassNotFoundException();
        }
        return  defineClass(className, bytes, 0, bytes.length);
    }
@覆盖
受保护类findClass(字符串名称)引发ClassNotFoundException{
字节[]字节;
试一试{
bytes=Files.readAllBytes(新文件(名称).toPath());
}捕获(IOE异常){
抛出新的ClassNotFoundException();
}
返回defineClass(类名,字节,0,字节.长度);
}
因为

classloader.loadClass("myclass.class");
将返回类类型对象,而不是自定义插件类型。
您需要创建该类的新实例。不要给你的插件命名为aClass,因为它不是这样的

Class clazz = system.loadClass(
                   pluginRootDirectory + 
                   pluginName + "\\" + 
                   pluginClassName + ".class");

Plugin plugin = (Plugin) clazz.newInstance();
这将使用反射创建插件。SimpleClassLoader仅将字符串转换为类。它不会给你想要转换为插件的对象

另请参见,如果插件有参数构造函数,请参见

public Plugin load(String pluginName, String pluginClassName) {}
您将返回Plugin类型的对象,以返回您需要编写的扩展插件的类型

public Class<? extends Plugin> load(String pluginName, String pluginClassName) {}

public Class我找到了解决方案,主要问题是同一个类加载器加载了我实现的类和接口,因此我无法强制转换。我们需要用其他类加载器加载插件接口。

什么是异常thrownloadClass只加载类。然后你需要创建一个新的类实例。这是非常通用和正确的,但它本身仍然不能为他提供插件。让他走完剩下的路。@CandiedOrange他正在写类加载器,所以他可能想用“load”方法加载一个类我知道这个决定,但这不是我需要的。这也给了我线程“main”java.lang.ClassCastException中的异常:FirstClass不能转换为ru。Plugin@jenius,FirstClass是否实现插件?是的。但它是外部类