Создать класс Java на Fly и добавить к пути к классу - PullRequest
1 голос
/ 24 мая 2019

Я генерирую Java-класс на лету и пытаюсь вызвать метод для него. Для этого кажется, что я должен сделать следующее

  • Скомпилируйте класс (имя файла javac не будет работать, поскольку это зависит от других зависимостей)
  • Добавление класса в путь к классам во время выполнения

Как мне этого добиться?

1 Ответ

3 голосов
/ 25 мая 2019

Я заставил его работать с 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...