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

时间:2012-03-26 08:34:16

标签: java class reflection

我的意思是,打开一个带有Java代码的文件作为一个类,而不是文件。所以基本上我想:

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

public class TestExample { 
private String example; 

public String getExample() { 
return example; 
} 
} 

我将在手写程序中打开它。它不是将文件中的文本识别为String或纯文本,而是在其中找到类TestExample。然后它会将其保存为类。

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

这可能吗?

4 个答案:

答案 0 :(得分:2)

是的,这是可能的。

看看这个例子。

http://weblogs.java.net/blog/malenkov/archive/2008/12/how_to_compile.html

知道如何查找和阅读文件(这非常简单),然后您可以使用显示的代码,尤其是

javax.tools.JavaCompiler
javax.tools.ToolProvider.getSystemJavaCompiler()

编译代码然后使用反射调用它。

答案 1 :(得分:1)

您可以“动态”编译Java代码。请参阅示例:How do I on-the-fly compile a java source contained in a String?

创建类加载器并使用反射

答案 2 :(得分:1)

您可能需要查看Beanshell

答案 3 :(得分:0)

我知道这已经过时了,但想加入主题:

是的,这是可能的。基本上你已经在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});

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