3

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

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

4

4 回答 4

3

看看反射 API

“即时”创建动态类

也读这个:

Java 反射:创建一个实现类- Jon Skeet回答了它!:)

于 2010-04-08T20:09:25.057 回答
1

是的。看看你可以用Javassist中的编译器做什么。

于 2010-04-08T20:10:32.187 回答
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...

为避免这种情况,如果您的类没有缩进为子类,您最考虑将它们声明为最终类,并在需要时进行复制(而不是按照它们的方式获取参数)

更多信息(关于如何有效地使用 Java)在Joshua Bloch的“Effective Java”一书中

于 2010-04-08T20:13:46.033 回答
0

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

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

于 2010-04-13T10:38:42.140 回答