Java反思:如何调用一个以私有接口作为参数的方法?

在Java中,我通常通过反射来调用一个方法,该方法通过使用以下方法构建我的参数来使用a作为参数:interface


Method method = theClass.getMethod("methodName", new Class[]{ IAnyInterface.class });

但是我不知道当 嵌套在私有类中时如何执行此操作:,其中是:interfaceJSomething.INestedInterfaceJSomethingprivate


private class JSomething {

   public void init(INestedInterface iSomething) {

       ...

   }


   public interface INestedInterface {

       public void notify();

   }


   ...

}

在这里使用这个甚至不能编译,因为接口是不可访问的:


Method method = theClass.getMethod("init", new Class[]{JSomething.INestedInterface.class});

我已经创建了一个准备被调用的代理处理程序,但是当我无法使用嵌套接口名称时,我被困在尝试构建参数中,有什么建议吗?class


三国纷争
浏览 161回答 1
1回答

慕姐4208626

嗯,你确定你的代码是通过在类前面加上前缀来编译的吗?该可见性修饰符不允许用于第一级类。每privateJLS 8.1.1访问修饰符,并且仅与直接封闭的类声明中的成员类有关。protectedprivate但无论如何,你可以通过反射提取,太;)Classfinal&nbsp;Class<?>&nbsp;clazz&nbsp;=&nbsp;Class.forName("your.package.JSomething$INestedInterface"); theClass.getMethod("methodName",&nbsp;new&nbsp;Class[]{&nbsp;clazz&nbsp;});或者,如果您的类本身就是一个内部类JSomethingstaticfinal&nbsp;Class<?>&nbsp;clazz&nbsp;=&nbsp;Class.forName("your.package.WrapperClass$JSomething$INestedInterface"); theClass.getMethod("methodName",&nbsp;new&nbsp;Class[]{&nbsp;clazz&nbsp;});请注意,每个“嵌套级别”都由一个符号标记,并且传入的称为类的二进制名称(请参阅JLS 13.1)。$String顶级类型 (§7.6) 的二进制名称是其规范名称 (§6.7)。成员类型的二进制名称 (§8.5, §9.5) 由其紧接类型的二进制名称组成,后跟 ,后跟成员的简单名称。$顺便说一句,接受 var-arg 参数,因此您只需提交单个值getMethodtheClass.getMethod("methodName",&nbsp;clazz);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java