Java 是否可以(通过反射)将检索到的类对象强制转换到接口?

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

我的工作区中有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);
    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;