3

実行時またはアプリケーションの実行中にサブクラスを生成することは可能ですか? もしそうなら、これはどのように達成され、不正なオブジェクトがアプリケーション内で大混乱を引き起こすのを防ぐためにどのような予防策を講じるべきですか?

編集:「その場でのクラス生成」から変更されたタイトル。

4

4 に答える 4

3

Reflection 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...

それを避けるために、クラスがサブクラスになるようにインデントされていない場合はクラスをfinalとして宣言し、必要に応じてコピーを作成することを検討してください(引数をそのまま受け取るのではなく)

Joshua Bloch著「Effective Java」に関する詳細情報 (Java を効果的に使用する方法)

于 2010-04-08T20:13:46.033 に答える
0

ソフトウェアを拡張する可能性を追加しようとしている他の開発者にとって、プラグインの動作に対する別のアプローチは、forName()クラス (JDBC などで使用される) と動的クラス ローディングの方法です。

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

于 2010-04-13T10:38:42.140 に答える