java - 动态生成 Java 类并添加到类路径

标签 java java-8

我正在动态生成一个 java 类并尝试调用它的方法。为此,似乎我必须执行以下操作

  • 编译类(javac 文件名将不起作用,因为它依赖于可能的其他依赖项)
  • 在运行时将类添加到类路径

我怎样才能实现这个目标?

最佳答案

我让它与 JavaCompiler 和自定义类加载器一起工作,如下所示。

 private Path compileSource(Path javaFile, String contractFileNameWithoutExtension) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        compiler.run(null, null, null, javaFile.toFile().getAbsolutePath());
        return javaFile.getParent().resolve(contractFileNameWithoutExtension+".class");
    }


public Class findClass(String name) {
        String filePath = sourceCodeLocation +"/"+ name.replace(".", "/")+".class";
        byte[] b = loadClassFromFile(filePath);
        return defineClass(name, b, 0, b.length);
    }

    private byte[] loadClassFromFile(String fileName)  {
        try {
            InputStream inputStream = FileUtils.getFileInputStream.apply(fileName);
            byte[] buffer;
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            int nextValue = 0;
            try {
                while ((nextValue = inputStream.read()) != -1) {
                    byteStream.write(nextValue);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            buffer = byteStream.toByteArray();
            return buffer;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

关于java - 动态生成 Java 类并添加到类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56285487/

相关文章:

java - 使用 AES 加密/解密并将信息存储在文本文件中

Java8 收集 map

java OutputStreamWriter 和 CP437

java - 更改 JCheckBox/JRadioButton 选择颜色

java - 如何将已检查的异常从 CompletableFuture 传递到 ControllerAdvice

java - 从具有相似属性的 List<Object> 创建 List<Set>

java - 如何告诉用户从程序安装 Java 8?

java - 接口(interface)方法可以有主体吗?

java - 如何否定代码生成的正则表达式中的短语?

java - 比 ListActivity 扩展 ActionBarActivity