Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从字符串加载类_Java_Reflection_Classloader - Fatal编程技术网

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()而不是将类文件临时写入磁盘。