実行時またはアプリケーションの実行中にサブクラスを生成することは可能ですか? もしそうなら、これはどのように達成され、不正なオブジェクトがアプリケーション内で大混乱を引き起こすのを防ぐためにどのような予防策を講じるべきですか?
編集:「その場でのクラス生成」から変更されたタイトル。
実行時またはアプリケーションの実行中にサブクラスを生成することは可能ですか? もしそうなら、これはどのように達成され、不正なオブジェクトがアプリケーション内で大混乱を引き起こすのを防ぐためにどのような予防策を講じるべきですか?
編集:「その場でのクラス生成」から変更されたタイトル。
はい。Javassistのコンパイラで何ができるか見てみましょう。
はい、可能です
パッケージ「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 を効果的に使用する方法)
ソフトウェアを拡張する可能性を追加しようとしている他の開発者にとって、プラグインの動作に対する別のアプローチは、forName()
クラス (JDBC などで使用される) と動的クラス ローディングの方法です。