2014-10-27 24 views
2

我寫了我自己的類加載器,它與實現接口插件的類一起工作。但是我無法將Class轉換爲Plugin。怎麼了?返回接口,而不是類<Interface>

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

Error:(18, 47) java: incompatible types: java.lang.Class cannot be converted to Plugin

我除了這是我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); 
    } 
+0

什麼是異常拋出 – user2717954 2014-10-27 08:13:03

+0

loadClass只是加載類。然後您需要創建該類的新實例。 – nos 2014-10-27 08:18:25

回答

1

您需要創建該類的新實例。不要將您的插件命名爲aClass,因爲這不是它的原因。

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?

+0

哦,它也給我例外線程「主」java.lang.ClassCastException:FirstClass不能被轉換成ru.Plugin – jenius 2014-10-27 10:54:25

+0

@jenius,FirstClass是否實現插件? – 2014-10-27 11:00:24

+0

是的。但它是外部類 – jenius 2014-10-27 11:01:20

0

有了這個

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

將返回類型的插件對象,返回類型是什麼擴展,你需要寫

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

這是所有奇妙的通用和正確的,但在它自己它仍然不會讓他一個插件。讓他休息一下。 – CandiedOrange 2014-10-27 08:50:14

+0

@CandiedOrange他正在寫類加載器,所以他可能想用「加載」方法加載一個類 – 2014-10-27 10:03:15

+0

我知道這個決定,但它不是我所需要的 – jenius 2014-10-27 10:50:19

0

我找到了解決方案,主要問題是相同的類加載器加載我的類和接口,這是我因此我無法施展。我們需要與其他類加載器一起加載插件接口。

相關問題