【问题标题】:Java reflection : how to call a method with private interface as argument?Java 反射:如何调用以私有接口为参数的方法?
【发布时间】:2019-08-25 13:53:03
【问题描述】:

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

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 参数,有什么建议吗?

【问题讨论】:

  • 你的私有类是内部类吗?如果是,请参阅此stackoverflow.com/questions/14112166/…
  • 您需要其他说明吗?
  • 谢谢。 private 并不真正存在,它是一个说话的数字。真正的class 位于具有不同包名的文件中,默认情况下使该类私有。它现在工作正常,我不知道$ 运算符^^。再次感谢。

标签: java reflection interface


【解决方案1】:

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

访问修饰符protected 和private 仅适用于member 直接封闭的类声明中的类。


但无论如何,您也可以通过反射提取Class ;)

final Class<?> clazz = Class.forName("your.package.JSomething$INestedInterface");
theClass.getMethod("methodName", new Class[]{ clazz });

或者如果你的 JSomething 类是 inner 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);

【讨论】:

  • 谢谢。 private 并不真正存在,它是一个演讲人物。真正的class 位于具有不同包名的文件中,默认情况下使该类为私有。它现在工作正常,我不知道$ 运算符^^。再次感谢。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多