当前位置: 首页 > 知识库问答 >
问题:

返回接口而不是类

韦宏扬
2023-03-14

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

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.类无法转换为插件

我补充说,这是我的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);
    }

共有3个答案

齐冥夜
2023-03-14

用这个

public Plugin load(String pluginName, String pluginClassName) {}

您将返回类型为Plugin的对象,以返回您需要编写的扩展插件的类型

public Class<? extends Plugin> load(String pluginName, String pluginClassName) {}
薛晨
2023-03-14

您需要创建一个类的新实例。不要将插件命名为类,因为它不是这样的。

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

Plugin plugin = (Plugin) clazz.newInstance();

这将使用反射创建插件。SimpleClassLoader仅将字符串转换为类。它不会给你想要投射到插件的对象。

另请参见使用Java中的反射创建一个引用变量类型设置为新实例类名的新实例?如果插件有一个参数构造函数,请看我可以使用类吗。有构造函数参数的newInstance()?

吴星汉
2023-03-14

是因为

classloader.loadClass("myclass.class");

将返回类类型的对象,而不是自定义插件类型。http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#loadClass(java.lang.String)

 类似资料:
  • RxJava新手,我对接口回调(通过接口变量从代码的内层/模块调用)和RxJava有疑问。要使其更清楚,请快速举例: 标准回调接口实现,接口,A类和B类 当调用classB方法“SomethingOccessed”时,结果是:“回调调用了方法SomethingOccessed”。接口的方法onCallbackCalled(String str)可以从classB中调用任意多次。 类A↓......

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我在后端代码中使用了Spring数据jpa。我已经包含了实体,dto接口,服务和jpa存储库代码。 现在的问题是,当我在< code>TopicService中调用< code>getAllTopics()时。它返回< code>Topic对象的列表,而不是< code>TopicDto。< code>Topic对象包含一个< code >示例列表,我没有将它包含在< code>TopicDto中

  • 问题内容: 这是我的发件人实体 当我尝试执行以下查询时: 发生以下错误: 错误:org.hibernate.property.BasicPropertyAccessor- HHH000123:类中的IllegalArgumentException:be.gimme.persistence.entities.Sender,属性的设置方法:senderId 错误:org.hibernate.prope

  • 我正在使用Yaml(和Python!)第一次。我试图从一个.yaml文件中加载多个文档,但没有得到我所期望的结果。我正在期待一个包含每个文档的dicts的dict返回,但却得到了一个生成器对象...?我应该注意到,当我在前面的测试中对单个文档yaml文件使用yaml.load()(而不是load_all())时,我能够很好地取回一个字典。 ...产生以下终端输出:

  • await返回[Function]而不是value 尝试使用async和await函数从firebase返回查询的值。返回的结果是[Function]或未处理的承诺拒绝警告。async和await是新的承诺,但我在几个网站上尝试了基本的示例,大多数都有resolve和reject参数,我认为这应该与firebase的承诺相同。 我试了两个不同版本,结果都不正确。 返回UnhandledPromis