为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2022-09-21 21:40:08

在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


查看完整描述

1 回答

?
慕姐4208626

TA贡献1516条经验 获得超1个赞

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

访问修饰符,并且仅与直接封闭的类声明中的成员类有关。protectedprivate


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

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

或者,如果您的类本身就是一个内部JSomethingstatic

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


查看完整回答
反对 回复 2022-09-21

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信