java - 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
当我无法使用嵌套接口名称时,我一直在尝试构建一个参数,有什么建议吗?
解决方案
嗯,你确定你的代码是通过在类前面加上前缀来编译的private
吗?第一级类不允许
使用
该可见性修饰符。每JLS 8.1.1
访问修饰符
protected
和private
仅适用 于直接封闭类声明中的成员类。
但无论如何,您也可以提取Class
via 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);
推荐阅读
- mysql - 尝试从 docker 容器连接到本地 mysql 数据库时连接被拒绝
- r - 如何将自循环添加到 ggraph?
- c# - 如何在我的代码中延迟 Visual Studio 2017 的实时编译?
- asp.net-core - EF Core - 无法为标识列 SqlException 插入显式值
- wordpress - 在电子邮件中发送自定义变量 - 联系表格 7
- spring-batch - couchbase 可以用作 spring-batch 的底层 JobRepository 吗?
- html - WBR 标记在 contenteditable div (Safari) 中破坏箭头导航
- html - Boostrap 折叠项在按钮上不起作用,数据的 id 正确且包含所有 cdn
- java - 如何正确配置 SimpleMongoRepository?
- json - 在python3中访问json文件