我在java程序中生成动态类,将所有代码写入java文件,将java文件编译为类文件,然后使用URLClassLoader加载类文件。这个问题是它在我的计算机上创建了很多文件。他们只是通过创建“虚拟文件”(文件对象)并且不生成任何实际文件来实现这一点,因为我这样做的方式需要时间并且看起来不干净且效率低下。
答案 0 :(得分:1)
如果查看ClassLoader类,它有一个方法可以从实际的字节序列中定义一个类。
我承认我没有在这个低级别上使用类加载器,但我的理解是这是一个模板模式,其中基类ClassLoader类知道如何在基于原始字节代码的VM中创建类。子类负责确定在哪里找到给定类的字节代码。
因此,您可以完全停止使用URLClassLoader并自行扩展ClassLoader。
答案 1 :(得分:0)
(更)直接的解决方案是执行以下操作:
ClassLoader
ClassLoader
ClassLoader
读取.class文件。这里有一些让你入门的东西 - 我将把字节代码放入对象中,作为练习给读者。 (如果你在这里使用SimpleFileVisitor
一点工作,那就不是很难了。Check out Java.NIO.)
public class CustomClassLoader extends ClassLoader {
@Override
public Class findClass(String binaryClassName) {
byte[] b = customLoadClassData(binaryClassName);
return defineClass(binaryClassName, b, 0, b.length);
}
private byte[] customLoadClassData(String binaryClassName) {
// Be sure to read in the specific .class file you want.
// A tip is to handle this *outside* of this class.
}
}
然后您可以像这样使用它:
CustomClassLoader loader = new CustomClassLoader();
Class clazz = loader.findClass("com.stackoverflow.some.binary.name");
...只要它没有抛出异常或返回null。
答案 2 :(得分:0)
字节代码生成和操作库允许您在内存中动态修改和生成类。 Javassist可能最容易开始,因为它允许使用Java语法。
它们的重量也比整个独立编译器的重量更轻。