是否可以在运行时或应用程序运行时生成子类?如果是这样,这是如何实现的,应该采取什么预防措施来防止恶意对象在应用程序中造成严重破坏?
编辑:标题已从“动态类生成”中修改。
答案 0 :(得分:3)
Create Dynamic class "on the fly"
也读这个:
Java Reflection: Create an implementing class - Jon Skeet回答了它! :)
答案 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使用)和动态类加载。