使用动态类生成向应用程序添加新功能

时间:2010-04-08 20:05:53

标签: java class on-the-fly

是否可以在运行时或应用程序运行时生成子类?如果是这样,这是如何实现的,应该采取什么预防措施来防止恶意对象在应用程序中造成严重破坏?

编辑:标题已从“动态类生成”中修改。

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

是。看看你在Javassist中使用编译器可以做些什么。

答案 2 :(得分:1)

是的,有可能

看看包“javax.tools”

您可以在运行时编译并加载一个类。

    String rogue = "package abc; "+
                 "public class RogueObjectWreakingHavoc extends SomeImportantClass {"+
                 " { System.exit(-1) }"+
                 "}"
    File sourceFile = new File("RogueObjectWreakingHavoc.java");
    FileWriter fileWriter = new FileWriter(sourceFile);
    fileWriter.write(rogue);
    fileWriter.close();

    List<File> files = new ArrayList<File>();
    files.add(sourceFile);

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,
                                                                          null,
                                                                          null);

    compiler.getTask(null, 
                     fileManager,
                     null,
                     null,
                     null,
                     fileManager.getJavaFileObjectsFromFiles(files))
    .call();
    fileManager.close();

   // load using URLClassLoader...

为了避免这种情况,你最常考虑将你的类声明为final,如果它们没有缩进为子类,并在需要时制作副本(而不是像他们那样接受参数)

Joshua Bloch撰写的"Effective Java"书中有关如何有效使用Java的更多信息

答案 3 :(得分:0)

对于寻求增加扩展软件可能性的其他开发人员,插件行为的另一种方法是Class的forName()方法(例如由JDBC使用)和动态类加载。

http://mindprod.com/jgloss/classforname.html