是否可以打开包含类的.txt/.java文件,并对其使用反射?

是否可以打开包含类的.txt/.java文件,并对其使用反射?,java,class,reflection,Java,Class,Reflection,我的意思是,以类而不是文件的形式打开一个包含Java代码的文件。所以基本上我想: ->在自行编写的Java应用程序(.txt/.log/.Java)中打开纯文本文件 ->识别文件中的类,例如: public class TestExample { private String example; public String getExample() { return example; } } 我将用手写程序打开这个。它不会将文件中的文本识别为字符串或纯文本,而是会在其中找到Test

我的意思是,以类而不是文件的形式打开一个包含Java代码的文件。所以基本上我想:

->在自行编写的Java应用程序(.txt/.log/.Java)中打开纯文本文件 ->识别文件中的类,例如:

public class TestExample { 
private String example; 

public String getExample() { 
return example; 
} 
} 
我将用手写程序打开这个。它不会将文件中的文本识别为字符串或纯文本,而是会在其中找到TestExample类。然后它将把这个保存为一个类

->在类上使用反射API ->从文件中获取字段、方法等并显示它们

这可能吗

是的,这是可能的

看看这个例子

了解如何查找和读取文件(这非常简单),然后可以使用所示的代码,尤其是

javax.tools.JavaCompiler
javax.tools.ToolProvider.getSystemJavaCompiler()
编译代码,然后使用反射调用它。

您可以“动态”编译java代码。见示例:

public class TestExample { 
private String example; 

public String getExample() { 
return example; 
} 
} 

创建类加载器并使用反射,您可能需要查看。

我知道这很旧,但希望添加到线程中:

是的,这是可能的。基本上,您已经使用java中的JavaCompiler类在运行时编译任何字符串,并返回可用于实例化对象的java.lang.class实例

我已经为我目前正在进行的一个项目编写了一个小型的、最小的库。您可以随意使用图书馆。EzReflection允许您完全在内存中编译代码,而无需编写.class文件

使用ezReflections,您的代码将如下所示:

InMemoryEzReflectionsCompiler compiler = new InMemoryEzReflectionsCompiler();
String src = new Scanner(new File("filename")).useDelimiter("\\Z").next();
Class<?> cls = compiler.compileClass("name of class", src);
// if your class doesn't require arguments in the constructor
cls.newInstance();
// if your class requires arguments for the constructor. Here assuming one Integer and one double   
Constructor<?> cons = cls.getConstructor(new Class[]{Integer.class,double.class});
Object obj = cons.newInstance(new Object[]{(int)10,(double)9});
InMemoryZreflectionsCompiler=新的InMemoryZreflectionsCompiler();
String src=new Scanner(新文件(“文件名”)).useDelimiter(\\Z”).next();
类cls=compiler.compileClass(“类的名称”,src);
//如果您的类不需要构造函数中的参数
cls.newInstance();
//如果您的类需要构造函数的参数。这里假设一个整数和一个双精度
构造函数cons=cls.getConstructor(新类[]{Integer.Class,double.Class});
objectobj=cons.newInstance(新对象[]{(int)10,(double)9});

您还可以在Github页面上找到一组关于如何使用ezReflections的教程

TestExample
是否也已编译?或者你正在尝试动态编译一个类?不,它没有编译。这是一个纯文本文件,我希望Java基本上能在其中找到类。由于编译器允许我在项目中对某个.java文件使用反射,而无需实际编译该.java文件项目,因此我认为在我自己编写的程序中也可以这样做。所以实际上我甚至没有试图编译这个类,我只是试图在纯文本上使用反射。你不能根据你的需要使用反射。反射在字节码上工作,而不是在源代码上。哦,那太糟糕了,不过我认为那会很方便