我編在運行時,我想在飛行中使用的一類,只要它的構造函數有一個參數反射類型不匹配
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();
這一切都似乎是在那裏運行時類似乎與彙編的不一致同樣的問題的一部分,雖然名稱相匹配。
'clazz.getConstructors()[0] .getParameterTypes()'返回什麼? – Jeffrey
在編輯中添加,看起來不錯。 – MonoThreaded