首页 > 解决方案 > Java 反射:如何调用以私有接口为参数的方法?

问题描述

在 Java 中,我通常通过 Reflection 调用一个方法,该方法通过使用以下方法interface构建我的参数来使用 as 参数:

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

interface但是当嵌套在私有类中时我不知道该怎么做: JSomething.INestedInterface,在JSomething哪里private

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当我无法使用嵌套接口名称时,我一直在尝试构建一个参数,有什么建议吗?

标签: javareflectioninterface

解决方案


嗯,你确定你的代码是通过在类前面加上前缀来编译的private吗?第一级类不允许
使用 该可见性修饰符。每JLS 8.1.1

访问修饰符protectedprivate仅适用 于直接封闭类声明中的成员类。


但无论如何,您也可以提取Classvia Reflection ;)

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 });

请注意,每个“嵌套级别”都由一个$符号标记,String您传入的称为类的二进制名称(请参阅JLS 13.1)。

顶级类型的二进制名称(第 7.6 节)是其规范名称(第 6.7 节)。

成员类型的二进制名称(第 8.5 节,第 9.5 节)由其直接封闭类型的二进制名称组成,后跟$,然后是成员的简单名称。


顺便说一句,getMethod接受一个 var-arg 参数,所以你可以只提交一个值

theClass.getMethod("methodName", clazz);

推荐阅读