Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:调用期望另一个接口作为参数的AIDL服务方法_Java_Android_Reflection_Android Service_Aidl - Fatal编程技术网

JAVA:调用期望另一个接口作为参数的AIDL服务方法

JAVA:调用期望另一个接口作为参数的AIDL服务方法,java,android,reflection,android-service,aidl,Java,Android,Reflection,Android Service,Aidl,我试图调用一个服务方法,该方法需要另一个接口作为参数。我必须指出,我需要在不知道源代码的情况下使用反射来实现这一点。因此,使用反射,我得到了与我需要调用其方法的服务对应的接口。然后我设法为该接口创建了一个对象。在这之后,我可以调用函数,对于大多数函数来说,这是可行的,但是当一个参数是另一个接口时,我会遇到一个问题。例如,假设我们在IPermissionService中有以下方法: public void addPermissionRevokedListener(IPermissionRevoke

我试图调用一个服务方法,该方法需要另一个接口作为参数。我必须指出,我需要在不知道源代码的情况下使用反射来实现这一点。因此,使用反射,我得到了与我需要调用其方法的服务对应的接口。然后我设法为该接口创建了一个对象。在这之后,我可以调用函数,对于大多数函数来说,这是可行的,但是当一个参数是另一个接口时,我会遇到一个问题。例如,假设我们在IPermissionService中有以下方法:

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调用该方法没有问题。尽管现在我需要重构我的代码,记住这些新信息

我会把这个留在这里,因为谁知道也许有人也会走同样的路,并最终质疑他周围的世界:)

另外,另一个问题仍然存在:是否有可能仅仅根据接口细节找到服务