有没有一种方法可以通过类名获取Java源代码?
例如,如果我可以访问具有类java.io.File
的库,我想要它的源代码。
我正在开发一种解析器,并且需要在执行时获取源代码。 我还需要递归搜索它。
假设上述类具有此方法:
int method (User user) {...}
我需要获取User
的源代码,以及它内部类的相关内容。
有没有一种方法可以通过类名获取Java源代码?
例如,如果我可以访问具有类java.io.File
的库,我想要它的源代码。
我正在开发一种解析器,并且需要在执行时获取源代码。 我还需要递归搜索它。
假设上述类具有此方法:
int method (User user) {...}
我需要获取User
的源代码,以及它内部类的相关内容。
有没有一种方法可以从类名中获取Java源代码?例如:...
您可能需要几种可能的解决方案。如果不知道您真正想要使用信息做什么,我们无法对我们的建议非常精确,但我会建议您尽可能远离源代码。 JSE源代码 可以在线获得,许多开源库也可以,但这并不总是情况。此外,当您想要找到它时,您需要将其全部组织起来,就像一个类路径一样,而Class对象则更容易获取和操作,而无需再次解析文本。
如果您只需要在运行时了解类的信息,请使用Java反射API。借助它,给定一个Class对象,您可以例如获取特定字段的类型、列出所有字段并遍历它们等等:
Class clazz = User.class;
Field field = clazz.getDeclaredField("var");
System.out.println(field.getType().getName());
Class.forName("MyClass")
查找一个类对象,并反射其结果。Class clazz = User.class;
String path = clazz.getPackage().getName().replaceAll("\\.","/");
File sourceFile = new File(path, clazz.getName() + ".java")
您需要增加更多的逻辑来检查类类型,因为显然原始类型没有类定义,并且您需要以不同的方式处理数组类型。
您可以使用Class.forName("MyClass")
按名称查找类(如果.class文件在您的类路径上)。
public class hello
{
public static void main(String[] args)
{
System.out.println("hello world!");
world();
}
static public void world()
{
System.out.println("I am second method");
}
}
执行javap hello
命令,您将得到以下结果:
Compiled from "hello.java"
public class hello extends java.lang.Object{
public hello();
public static void main(java.lang.String[]);
public static void world();
}
javap -c hello
来获取更详细的结果。 - Searene是的,如果您下载源代码。它可以在官方下载页面上公开下载。
如果您正在使用Eclipse,并且每当您使用该类时,您可以右键单击>查看源代码(或简单地单击类> F3),它将打开一个带有源代码的新选项卡。
URL sourceURL=obj.getClass().getProtectionDomain().getCodeSource().getLocation();
它将是一个 .class 文件、.jar、.zip,或其他形式。
通常情况下,无法获取类的真实、实际的Java源代码。
如果您有(例如)包含类源代码的ZIP或JAR文件,则可以根据类的完全限定名称提取相关源文件。但是,首先必须从某个地方获取这些ZIP/JAR文件。
如果您只对方法签名、属性名称和类型等感兴趣,则大部分信息可在运行时使用Java反射API获得。但是,它取决于类是否使用调试信息编译(请参见javac编译器的-g选项),将有多少信息可用。而且这与您可以从真正的源代码中获得的信息远远不同。
反编译器可能能够从字节码文件生成可编译的类源代码。但是,反编译的代码看起来与原始源代码完全不同。
我猜,如果您有一个填充了类javadoc的网站的URL,您可以从类名、方法名或公共属性名转到相应的javadoc URL。您甚至可以从javadoc中“屏幕截取”描述。但是再次强调,这不是真正的源代码。