【问题标题】:Returning Interface instead Class<Interface>返回接口而不是 Class<Interface>
【发布时间】:2014-10-27 08:10:48
【问题描述】:

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

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);
    }

【问题讨论】:

  • 抛出了什么异常
  • loadClass 只是加载类。然后,您需要创建该类的一个新实例。

标签: java class casting classloader


【解决方案1】:

因为

classloader.loadClass("myclass.class");

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

【讨论】:

    【解决方案2】:

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

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

    这会使用反射创建插件。 SimpleClassLoader 只是把一个字符串变成了一个类。它不会为您提供要转换为插件的对象。

    另请参阅Using reflection in Java to create a new instance with the reference variable type set to the new instance class name?,如果插件有参数构造函数,请参阅Can I use Class.newInstance() with constructor arguments?

    【讨论】:

    • 哦,它还在线程“main”中给了我异常 java.lang.ClassCastException: FirstClass cannot be cast to ru.Plugin
    • @jenius,FirstClass 是否实现插件?
    • 是的。但它是外部类
    【解决方案3】:

    有了这个

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

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

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

    【讨论】:

    • 这一切都非常通用且正确,但就其本身而言,它仍然不会让他获得插件。带他走完剩下的路。
    • @CandiedOrange 他正在编写类加载器,所以他可能想用“加载”方法加载一个类
    • 我知道这个决定,但这不是我需要的
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2018-01-03
      • 2022-01-18
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多