Java 无法强制转换到相同类型的不同JAR(Apache FOP、URL类加载器)
使用 我想使用一个特定的Fop框架,而不是已经加载到类路径中的Fop框架。 通过java反射尝试初始化此特定类,我收到以下错误:Java 无法强制转换到相同类型的不同JAR(Apache FOP、URL类加载器),java,apache,casting,classloader,apache-fop,Java,Apache,Casting,Classloader,Apache Fop,使用 我想使用一个特定的Fop框架,而不是已经加载到类路径中的Fop框架。 通过java反射尝试初始化此特定类,我收到以下错误: org.apache.fop.apps.FopFactory cannot be cast to org.apache.fop.apps.FopFactory 测试类: import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.apache.fop.apps.F
org.apache.fop.apps.FopFactory cannot be cast to org.apache.fop.apps.FopFactory
测试类:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.apache.fop.apps.FopFactory;
public class FOPTest {
private FopFactory fopFactory;
public FOPTest() {
try {
DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader(
"C:\\path\\To\\FOP\\Jar\\Fop10" );
Class<FopFactory>classManuallyLoaded = (Class<FopFactory>) classLoader
.loadClass("org.apache.fop.apps.FopFactory");
for (Method method : classManuallyLoaded.getMethods()) {
method.setAccessible(true);
}
for(Constructor consr : classManuallyLoaded.getDeclaredConstructors()) {
consr.setAccessible(true);
}
Method methodToString = classManuallyLoaded.getMethod("newInstance");
Object res=null;
methodToString.setAccessible(true);
try {
res = methodToString.invoke(classManuallyLoaded.newInstance());
} catch (Exception e) {
System.out.println("Error protected: " + e);
res = methodToString.invoke (classManuallyLoaded);
}
System.out.println("GET CLASS: " + res.getClass());
if(res instanceof FopFactory) {
System.out.println("Instance of FopFactory");
}
this.fopFactory = (FopFactory) res;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new FOPTest();
}
}
import java.lang.reflect.Constructor;
导入java.lang.reflect.Method;
导入org.apache.fop.apps.FopFactory;
公开课{
私营工厂;
公共福利{
试一试{
DirectoryBasedParentLassLoader类加载器=新的DirectoryBasedParentLassLoader类加载器(
“C:\\path\\To\\FOP\\Jar\\Fop10”);
ClassclassManuallyLoaded=(类)类加载器
.loadClass(“org.apache.fop.apps.FopFactory”);
对于(方法:classManuallyLoaded.getMethods()){
方法setAccessible(true);
}
对于(构造函数consr:classManuallyLoaded.getDeclaredConstructors()){
consr.setAccessible(true);
}
方法methodToString=classManuallyLoaded.getMethod(“newInstance”);
对象res=null;
methodToString.setAccessible(true);
试一试{
res=methodToString.invoke(classManuallyLoaded.newInstance());
}捕获(例外e){
System.out.println(“错误保护:+e”);
res=methodToString.invoke(classManuallyLoaded);
}
System.out.println(“获取类:+res.getClass());
if(FOPFFactory的res instanceof){
System.out.println(“FOPFFactory实例”);
}
this.fopFactory=(fopFactory)res;
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
新FOPTest();
}
}
和控制台输出
Error protected: java.lang.IllegalAccessException: Class showproject.FOPTest can not access a member of class org.apache.fop.apps.FopFactory with modifiers "protected"
GET CLASS: class org.apache.fop.apps.FopFactory
java.lang.ClassCastException: org.apache.fop.apps.FopFactory cannot be cast to org.apache.fop.apps.FopFactory
at showproject.FOPTest.<init>(FOPTest.java:38)
at showproject.FOPTest.main(FOPTest.java:45)
Error protected:java.lang.IllegalAccessException:Class showproject.FOPTest无法访问修饰符为“protected”的类org.apache.fop.apps.FopFactory的成员
获取类:CLASS org.apache.fop.apps.FopFactory
java.lang.ClassCastException:org.apache.fop.apps.FopFactory不能强制转换为org.apache.fop.apps.FopFactory
在showproject.FOPTest.(FOPTest.java:38)
位于showproject.FOPTest.main(FOPTest.java:45)
我希望有人能帮助我创建基于DirectoryBased类加载器类的FopFactory外部基于DirectoryBased的类加载器似乎不能完美工作。使用java URLClassLoader不存在强制转换问题。Thx似乎基于外部目录的类加载器无法完美工作。使用java URLClassLoader不存在强制转换问题。Thx您确定org.apache.fop.apps.FopFactory是公共对象吗?您确定org.apache.fop.apps.FopFactory是公共对象吗?