在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
提交
取消