Java 是否可以(通过反射)将检索到的类对象强制转换到接口?
我的工作区中有3个项目——A、B和C,这是一个Android lib项目Java 是否可以(通过反射)将检索到的类对象强制转换到接口?,java,android,reflection,Java,Android,Reflection,我的工作区中有3个项目——A、B和C,这是一个Android lib项目 A包含一个名为Atest B包含一个名为Btest的类,该类实现接口I C包含I接口 A和B都安装在我的Android设备上。 在Atest运行时,我正在执行下一个代码: Context otherContext = createPackageContext("com.package.b", CONTEXT_INCLUDE_CODE | CONTEXT_IGNORE_SECURITY); C
Atest
Btest
的类,该类实现接口I
I
接口Atest
运行时,我正在执行下一个代码:
Context otherContext = createPackageContext("com.package.b",
CONTEXT_INCLUDE_CODE | CONTEXT_IGNORE_SECURITY);
ClassLoader loader = otherContext.getClassLoader();
Class<?> btest = Class.forName("com.package.b.BTest", true, loader);
Context otherContext=createPackageContext(“com.package.b”,
上下文(包括(代码|上下文)忽略(安全));
ClassLoader=otherContext.getClassLoader();
Class btest=Class.forName(“com.package.b.btest”,true,loader);
现在我的问题是——有没有办法在A
run上下文中将btest转换成I
我尝试了很多明显的(还有一些不太明显的)技巧,但都没有效果。我当然可以探索btest的方法和接口,调用它的方法,等等。。但我无法将其转换为I
,尽管A和B在lib项目C中引用了完全相同的I
接口
提前谢谢
附言
请注意,我将它强制转换为一个接口,而不是一个对象,因此我猜不同的
类加载器
不是这种情况的原因。接口I
必须位于类路径上(或者运行时可以加载),否则会出现运行时异常。REF选举不允许你回避这个问题。你的问题非常不清楚,所以我不得不猜测你的意思
首先,Java中没有接口
类,所以您不能这样说:
Interface<?> i = // some magic transformation of btest
当然,问题是,由于您的代码动态加载了BTest
和I
,因此无法编写静态类型为BTest
或I
的变量。因此,cast没有真正的用途,只是作为一种循环方式来断言BTest
实现了I
另一种可能性是,您正在谈论强制转换类对象。但是,考虑到必须使用通配符作为类的类型参数,这没有任何意义
重申一下,如果I
静态链接到代码中,则可以执行以下操作:
Object btest = // create or retrieve the instance reflectively
I i = (I) btest;
如果I
没有静态链接到您的代码中,那么您(显然)不能在上面声明I
,并且您必须对btest实例的所有操作使用反射。您不能反射地“执行”静态键入。期间。因为您在运行时执行所有这些动态加载,所以没有构造虚拟方法表及其关联的VPointer。因此,运行时无法动态地将对接口方法的调用分派给适当加载的实现。您必须使用反射。A
链接到C
,因此我猜I
在类路径上。是的,如果C
是可用类,这意味着I
是可加载的。你到底想做什么?我想把Btest
称为I
,但我不能。我只能将其称为对象或类/类对象,这意味着我不能直接调用其实现的接口方法,但我只能使用“invoke”。现在更清楚了吗?如果导入I
并将Btest
转换为I
,会发生什么?你有编译器错误吗?在B
过程中当然有可能;它只是在上下文中执行时失败。有什么不清楚的?我正在通过反射检索一个对象,一个实现接口I
的对象,我想在我的运行上下文中将它称为I
,而不是类
对象,以跳过“invoke”调用,并通过a
和B
都知道并有权访问的接口访问其数据。在B
上下文中运行时,我当然可以将Btest
转换为I
,而这正是我在A
上下文中运行时试图实现的目标。“它在我的运行上下文中作为I,而不是作为类对象”这一点不清楚。类对象和实现I
的对象完全不同。“类对象和实现I的对象完全不同”;当然我的意思是调用Object obj=btest.newInstance()并将obj强制转换为I
。我不明白为什么你们听起来这么奇怪-我无法访问检索到的对象,只能使用反射,所以我想也许可以将obj转换为I
,一个已知的接口,并通过调用I
方法将我从所有那些“调用”调用中解救出来。现在更清楚了吗?这么简单,这么清楚。是否存在通过“调用”访问对象方法的转义?我必须通过反射来接近那个物体。。。
Object btest = // create or retrieve the instance reflectively
I i = (I) btest;