私はある種のライブラリを書いています。そこに抽象クラスがあります。クライアントコードは、いくつかのメソッドを使用するように拡張する必要があります。ユーザーがアプリケーションを終了し、再起動した後、concrette クラスへの参照を復元する必要がある場合があります。私の考えは、ユーザーのクラスの正規名を保存してから、それを作成するnewInstance()
ことでした。しかし、何らかの理由でインスタンスを作成できません。私はテストをしました:
void foo(AbstractClass a) {
String classname = a.getClass().getCanonicalName();
System.out.println(classname); //Output: "com.test.clientcode.Main.ConcretteClass"
a = null; // here I lost my reference to ConcretteClass for example, so all I have is a classname
Class.forName(classname).newInstance(); //Throws exception: "java.lang.ClassNotFoundException: `com.test.clientcode.Main.ConcretteClass"
}
これは、ライブラリ コード内のメソッドです。引数a
として、具体的なユーザー クラスのインスタンスを指定します。
更新:簡単にするために:私のライブラリには上記のようなメソッドがありa
ます.2行目の出力に見られるように、引数はクライアントの ConcretteClass への参照です。その後、参照を失います。ConcretteClass の正規名しか知らない場合、ConcretteClass の新しいインスタンスを作成するにはどうすればよいですか?