在Java中,我通常通過反射來調用一個方法,該方法通過使用以下方法構建我的參數來使用a作為參數:interfaceMethod method = theClass.getMethod("methodName", new Class[]{ IAnyInterface.class });但是我不知道當 嵌套在私有類中時如何執行此操作:,其中是:interfaceJSomething.INestedInterfaceJSomethingprivateprivate class JSomething { public void init(INestedInterface iSomething) { ... } public interface INestedInterface { public void notify(); } ...}在這里使用這個甚至不能編譯,因為接口是不可訪問的:Method method = theClass.getMethod("init", new Class[]{JSomething.INestedInterface.class});我已經創建了一個準備被調用的代理處理程序,但是當我無法使用嵌套接口名稱時,我被困在嘗試構建參數中,有什么建議嗎?class
1 回答

慕姐4208626
TA貢獻1852條經驗 獲得超7個贊
嗯,你確定你的代碼是通過在類前面加上前綴來編譯的嗎?
該可見性修飾符不允許用于第一級類。每private
JLS 8.1.1
訪問修飾符,并且僅與直接封閉的類聲明中的成員類有關。
protected
private
但無論如何,你可以通過反射提取,太;)Class
final Class<?> clazz = Class.forName("your.package.JSomething$INestedInterface"); theClass.getMethod("methodName", new Class[]{ clazz });
或者,如果您的類本身就是一個內部類JSomething
static
final Class<?> clazz = Class.forName("your.package.WrapperClass$JSomething$INestedInterface"); theClass.getMethod("methodName", new Class[]{ clazz });
請注意,每個“嵌套級別”都由一個符號標記,并且傳入的稱為類的二進制名稱(請參閱JLS 13.1)。$
String
頂級類型 (§7.6) 的二進制名稱是其規范名稱 (§6.7)。
成員類型的二進制名稱 (§8.5, §9.5) 由其緊接類型的二進制名稱組成,后跟 ,后跟成員的簡單名稱。
$
順便說一句,接受 var-arg 參數,因此您只需提交單個值getMethod
theClass.getMethod("methodName", clazz);
添加回答
舉報
0/150
提交
取消