我正在尝试使用反射为Java编写反编译器(我需要的是传入的jar文件中的方法签名信息)。我正在使用URLClassLoader
从jar文件加载类,然后将该类传递给我的反编译器。
然而,我遇到了一个问题。我正在尝试阅读的jar包含已加载到我的环境中的不同版本的类。所以当我打电话时
ClassLoader myClassLoader = URLClassLoader.newInstance(jars, null);
Class<?> classToDecompile = Class.forName(className, false, myClassLoader);
它从我的jar文件中返回的不是类,而是已经加载的类。有没有办法只为反射加载类信息并从传入的jar而不是从JRE中获取它?
修改
我正在尝试反编译的jar包含java.lang包中的类,这会导致抛出安全异常:
java.lang.SecurityException:禁止的包名:java.lang
答案 0 :(得分:3)
ClassLoader.loadClass(String,boolean) - URLClassLoader继承 - 首先检查先前加载的类,然后检查没有找到任何与父类加载器的检查。您可以覆盖该方法以绕过先前加载的类的检查。不确定你是否必须绕过父母。
请注意,这将是一个邪恶的类装载机;你可能不应该把它用于其他任何事情。
您也可以尝试自己读取jar,获取类文件的内容(字节代码),并自己调用ClassLoader.defineClass(name,byte [],int,int),为类提供唯一的名称。实际上,我认为这是一个更好的主意。
答案 1 :(得分:0)
为什么在JAD时浪费时间?如果您仍想实现这一目标,则必须使用child-first策略编写自己的类加载器。