2013-07-07 253 views
0

我編在運行時,我想在飛行中使用的一類,只要它的構造函數有一個參數反射類型不匹配

package com.notmycompany; 

import com.mycompany.Manager; 
import com.mycompany.Processor; 

import com.mycompany.Event; 

public class CustomProcessor extends Processor { 


    public CustomProcessor(Manager m) { 
     super(m); 
    } 

    @Override 
    public void process(Event evt) { 
     // Do you own stuff 
     System.out.println("My Own Stuff"); 
    } 
} 

編譯去罰款,我可以加載類的時候了。但構造者給我一個很難的時間。

Class<?> clazz = urlClassLoader.loadClass("com.notmycompany.CustomProcessor"); 
Constructor<?> constructor = clazz.getConstructor(com.mycompany.Manager.class); 
this.customProcessor = (Processor) constructor.newInstance(this.manager); 

在這種情況下,getConstructor拋出一個NoSuchMethodException

我試圖newInstance呼叫期間使用getConstructors代替,其中僅讓我一個步驟進一步與IllegalArgumentException(當然this.manager是com.mycompany.Manager)

Constructor<?> list[] = clazz.getConstructors(); 
Constructor<?> constructor = list[0]; 
this.customProcessor = (Processor) constructor.newInstance(this.manager); 

Watever我做的,有管理對象之間的運行時間和編譯的不匹配
如何修復此構造函數簽名?

編輯1: getParameterTypes輸出

 for(Class<?> c : constructor.getParameterTypes()) { 
      System.out.println(c); 
     } 

輸出

class com.mycompany.Manager 


編輯2:我刪除構造參數作爲臨時解決方法

現在代碼拋出ClassCastException抱怨構造函數是com.notmycompany.CustomProcessor cannot be cast to com.mycompany.Processor引用:

Constructor<?> constructor = clazz.getConstructor(); 
this.customProcessor = (Processor) constructor.newInstance(); 

這一切都似乎是在那裏運行時類似乎與彙編的不一致同樣的問題的一部分,雖然名稱相匹配。

+1

'clazz.getConstructors()[0] .getParameterTypes()'返回什麼? – Jeffrey

+0

在編輯中添加,看起來不錯。 – MonoThreaded

回答

1

我已經能夠得到它的使用使用currentThread父(而不是從頭開始使用URL創建的URLClassLoader)

URLClassLoader ucl = (URLClassLoader)Thread.currentThread().getContextClassLoader(); 
URLClassLoader ucl2 = new URLClassLoader(new URL[] { new URL("file://d:/temp/")},ucl); 
Class<?> clazz = ucl2.loadClass("com.notmycompany.CustomProcessor"); 

我希望這可以爲你節省網址後最終奏效2天!

1

您的CustomProcessor類沒有構造函數,因爲您認爲是您的構造函數的方法名稱不同。

public CustomLatencyProcessor(Manager m) { 
    super(m); 
} 

應改爲

public CustomProcessor(Manager m) { 
    super(m); 
} 

因爲你的類的名稱是CustomProcessor。構造函數的名稱必須完全匹配其包含的類的名稱。

+0

Typo修正,構造函數名稱在我的代碼中是正確的,現在在問題中也是正確的。這個代碼再次編譯。 – MonoThreaded