有没有办法以编程方式告诉Java类的源代码?

时间:2014-09-15 16:20:21

标签: java classloader

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

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可能不起作用