Java:从字符串加载类
我知道这可能与类加载器有关,但是我找不到一个例子(可能是我在谷歌上搜索错误的关键字) 我试图以字符串的形式加载类(或方法)。字符串不包含类的名称,但包含类的代码,例如Java:从字符串加载类,java,reflection,classloader,Java,Reflection,Classloader,我知道这可能与类加载器有关,但是我找不到一个例子(可能是我在谷歌上搜索错误的关键字) 我试图以字符串的形式加载类(或方法)。字符串不包含类的名称,但包含类的代码,例如 class MyClass implements IMath { public int add(int x, int y) { return x + y; } } 然后像这样做: String s = "class MyClass implements IMath { public int ad
class MyClass implements IMath {
public int add(int x, int y) {
return x + y;
}
}
然后像这样做:
String s = "class MyClass implements IMath { public int add(int x, int y) { return x + y; }}";
IMath loadedClass = someThing.loadAndInitialize(string);
int result = loadedClass.add(5,6);
现在很明显,someThing.loadAndInitialize(string)
-部分是我不知道如何实现的部分。这是可能的吗?或者运行JavaScripts并以某种方式“给出”变量/对象(如x和y)会更容易吗
谢谢您的提示。您可以在JDK 7中使用Rhino和JavaScript。这可能是一个很好的方法
invokedynamic
即将到来
如果你想坚持使用Java,你需要一些东西来解析源代码并将其转换成字节码,比如cglib。你可以在JDK 7中使用Rhino和JavaScript。这可能是一个很好的方法
invokedynamic
即将到来
如果你想坚持使用Java,你需要一些东西来解析源代码并将其转换成字节码,比如cglib。使用Java编译器API。这是一篇博客文章,向你展示了如何做到这一点
您可以为此使用临时文件,因为这需要输入/输出文件,或者您可以创建从字符串读取源的自定义实现。从:
一旦有了输出文件(这是一个编译的.class
文件),就可以使用URLClassLoader
加载它,如下所示:
ClassLoader loader = new URLClassLoader(new URL[] {myClassFile.toURL());
Class myClass = loader.loadClass("my.package.MyClass");
然后使用以下方法对其进行实例化:
myClass.newInstance();
或者使用构造函数
使用Java编译器API。这是一篇博客文章,向您展示了如何使用Java编译器API
您可以为此使用临时文件,因为这需要输入/输出文件,或者您可以创建从字符串读取源的自定义实现。从:
一旦有了输出文件(这是一个编译的.class
文件),就可以使用URLClassLoader
加载它,如下所示:
ClassLoader loader = new URLClassLoader(new URL[] {myClassFile.toURL());
Class myClass = loader.loadClass("my.package.MyClass");
然后使用以下方法对其进行实例化:
myClass.newInstance();
或者使用
构造函数
你可以使用JavaCompiler
编译它,但是我建议你使用Groovy
来创建这个运行时类。这会容易得多。你可以使用JavaCompiler
来编译它,但是我建议你使用Groovy
来创建这个运行时类更简单。首先,您需要编译代码,例如使用编译器API:(,)。
在使用ClassLoader()加载编译后的类之后,首先需要编译代码,例如使用编译器API:(,)。
然后用类加载器()加载编译后的类就个人而言,如果源代码必须是Java,我会使用Java编译API,如果这还不够,我会使用Janino、javassist等。就个人而言,如果源代码必须是Java,我会使用Java编译API,如果这还不够,我会使用Janino、javassist等。谢谢,我不知道编译器API:-)我宁愿使用defineClass()而不是将类文件临时写入磁盘。谢谢,我不知道编译器api:-)我宁愿使用defineClass()而不是将类文件临时写入磁盘。