在所有java版本中,是否可以将对象强制转换为与其抽象parrent(而不是其parrent)结构完全相同的对象?

在所有java版本中,是否可以将对象强制转换为与其抽象parrent(而不是其parrent)结构完全相同的对象?,java,reflection,casting,jvm,Java,Reflection,Casting,Jvm,我有一个名为testlib.jar的java库,它有一个抽象类,如下所示: com.test; public abstract class AbstractClass { public abstract void foo(); } com.test; public class MyClass extends AbstractClass{ @Override public void foo() { System.out.println("foo is ca

我有一个名为
testlib.jar的java库,它有一个抽象类,如下所示:

com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
com.test;
public class MyClass extends AbstractClass{
    @Override
    public void foo() {
        System.out.println("foo is called in MyClass");
    }
}
com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
和一个名为
MyClass
的类,如下所示:

com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
com.test;
public class MyClass extends AbstractClass{
    @Override
    public void foo() {
        System.out.println("foo is called in MyClass");
    }
}
com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
就这样。在我的应用程序中,我有一个抽象类,如下所示:

com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
com.test;
public class MyClass extends AbstractClass{
    @Override
    public void foo() {
        System.out.println("foo is called in MyClass");
    }
}
com.test;
public abstract class AbstractClass {
    public abstract void foo();
}
因此它与
testlib.jar
中的抽象类相同。在这里,我加载了
testlib.jar
文件,实例化了
MyClass
的一个对象,并将其转换为我的应用程序已知的抽象类(第二个):

请注意,我正在将
MyClass
转换为一个实际上不是其父类的类

我有两个问题要问:

1-这种方法在所有JVM中都有效吗


2-JVM如何在内部处理此强制转换操作?

我认为您试图做的是违反直觉且容易出错的操作。
你不必使用这种方法。相反,提取要在库中共享的API,并在双方(提供者和客户端)中共享它

此外,您的示例存在缺陷,因为您使用依赖父类加载器的
URLClassLoader
构造函数:

URLClassLoader urlClassLoader = new URLClassLoader(
            new URL[]{new URL("file:\\path\\to\\testlib.jar")});
如文件所述:

使用 默认委托父类加载器。将在中搜索URL 在中首次搜索后为类和资源指定的顺序 父类加载器

这意味着:

Class<AbstractClass> MyClass = (Class<AbstractClass>)urlClassLoader.loadClass("com.test.MyClass");
不要使用默认的父类加载器,您可能会看到抛出
java.lang.ClassCastException

URLClassLoader urlClassLoader = new URLClassLoader(
            new URL[]{new URL("file:\\path\\to\\testlib.jar")}, null);

刚刚在安卓7.1.1上使用
DexClassLoader
测试了这种方法,它成功了,但在安卓4.2.2上测试时失败了。

看一看,即使它成功了,那也是一团糟。您应该真正避免依赖于将一个jar优先于另一个jar来加载类的特定定义,该类的FQN与类路径上的其他类共享。我想问一下,为什么同一个FQN有两个不同的版本,为什么要选择加载哪一个。@zhh很好的提示,谢谢。但是这有点不同,因为我使用的是动态加载和反射。你所说的
提取你想要在库中共享的API并在库的两侧共享它是什么意思。假设我是这个类的提供者,我将您需要的API打包在一个JAR中,我将这个JAR提供给您作为依赖项添加到您的类路径中,而不是您在源代码中复制内容类。当提供者类也需要访问客户机类时该怎么办?