JAVA:调用期望另一个接口作为参数的AIDL服务方法
我试图调用一个服务方法,该方法需要另一个接口作为参数。我必须指出,我需要在不知道源代码的情况下使用反射来实现这一点。因此,使用反射,我得到了与我需要调用其方法的服务对应的接口。然后我设法为该接口创建了一个对象。在这之后,我可以调用函数,对于大多数函数来说,这是可行的,但是当一个参数是另一个接口时,我会遇到一个问题。例如,假设我们在IPermissionService中有以下方法:JAVA:调用期望另一个接口作为参数的AIDL服务方法,java,android,reflection,android-service,aidl,Java,Android,Reflection,Android Service,Aidl,我试图调用一个服务方法,该方法需要另一个接口作为参数。我必须指出,我需要在不知道源代码的情况下使用反射来实现这一点。因此,使用反射,我得到了与我需要调用其方法的服务对应的接口。然后我设法为该接口创建了一个对象。在这之后,我可以调用函数,对于大多数函数来说,这是可行的,但是当一个参数是另一个接口时,我会遇到一个问题。例如,假设我们在IPermissionService中有以下方法: public void addPermissionRevokedListener(IPermissionRevoke
public void addPermissionRevokedListener(IPermissionRevokedListener listener)
java.lang.IllegalArgumentException:
method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener,
got $Proxy4
生成此方法的参数时,我的代码会找到两个可能的类:
IPermissionRevokedListener$Default
IPermissionRevokedListener$Stub$Proxy
目前它使用第一个并调用构造函数来创建对象。
到目前为止,一切似乎都很好,但在执行调用时会引发异常:
java.lang.IllegalArgumentException:
method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener,
got IPermissionRevokedListener$Default
我一直在四处挖掘,尝试一些组合,但我找不到解决这个问题的方法。有办法解决这个问题吗
对于那些不熟悉AIDL的人,接口部分通常是这样的:
另外,一种可能是尝试连接到另一个服务并获取接口对象,类似于第一个服务的方式,但我不确定如何根据接口信息确定它是哪个服务。此外,我可能会遇到几乎相同的问题,唯一的区别是IPermissionRevokedListener$Stub$Proxy而不是IPermissionRevokedListener$Default,因为IPermissionRevokedListener$Stub$Proxy是在从绑定服务获取接口时给出的)。但是,我想知道是否也有可能找到基于接口的服务
无论如何,如果能以某种方式使用$Default对象,目前我会很高兴
编辑:最让我头疼的是,$Default实现了所需的接口,但不知何故没有被接受。
另外,我刚刚尝试使用反射代理动态创建接口实现,得到了一个类似的异常:
public void addPermissionRevokedListener(IPermissionRevokedListener listener)
java.lang.IllegalArgumentException:
method addPermissionRevokedListener argument 1 has type IPermissionRevokedListener,
got $Proxy4
经过很多时间,我想我终于知道问题出在哪里了。在搜索接口实现时,我使用Dex类加载器加载和检查类。所有这些都可以正常工作,但看起来这会导致以后出现问题。当我从Dex类加载器更改为从相关接口检索的类加载器时,使用$Default调用该方法没有问题。尽管现在我需要重构我的代码,记住这些新信息 我会把这个留在这里,因为谁知道也许有人也会走同样的路,并最终质疑他周围的世界:) 另外,另一个问题仍然存在:是否有可能仅仅根据接口细节找到服务