Java类加载器加载它能找到的具有匹配名称的第一个类。有没有办法以编程方式告诉哪一个被加载?
即,我可以用一种方式更改下面的主要内容,告诉我们加载哪个ClassLoaderTest(除了调用test()
之外)?
echo "public class ClassLoaderTest { public static String test() { return \"1\"; } }" > ClassLoaderTest.java
javac ClassLoaderTest.java
mkdir one
mv ClassLoaderTest.class one
echo "public class ClassLoaderTest { public static String test() { return \"2\"; } }" > ClassLoaderTest.java
javac ClassLoaderTest.java
mkdir two
mv ClassLoaderTest.class two
echo "public class Main { public static void main(String[] _) { System.out.println(ClassLoaderTest.test()); } }" > Main.java
javac Main.java
java -classpath one:two:. Main
java -classpath two:one:. Main
根据类路径顺序输出1
然后2
。
答案 0 :(得分:3)
getClass().getProtectionDomain().getCodeSource().getLocation()
- JRE类可能为null。
答案 1 :(得分:1)
您想要分析Java类的源代码。有byte code parsers like ASM为此目的而量身定制。当你查看ASM的代码时,它会通过
找到一个类的源代码getClassLoader()
.getResourceAsStream(ClassLoaderTest.class.getName().replace('.', '/') + ".class")
如果你只需要一个类文件的内容而不是它的位置(甚至可能不存在)就足够了。
另一种方法是通过ProtectionDomain
提到的方法,但需要额外的安全权限或ClassLoader::getResource
,这些权限对于不在存储上存储类文件的自定义ClassLoader
可能不起作用