ええ、知っています。質問の長いタイトル...それで、文字列にクラス名があります。私はこの方法でこのクラスのオブジェクトを動的に作成しています:
String className = "com.package.MyClass";
Class c = Class.forName(className);
Object obj = c.newInstance();
objMyClassオブジェクトに動的に変換するにはどうすればよいですか?私はこのように書くことはできません:
MyClass mobj = (MyClass)obj;
...classNameは異なる場合があるためです。
呼び出したくないメソッドを宣言するインターフェイスを宣言しないでください:
public interface MyInterface
{
void doStuff();
}
public class MyClass implements MyInterface
{
public void doStuff()
{
System.Console.Writeln("done!");
}
}
それからあなたは使う
MyInterface mobj = (myInterface)obj;
mobj.doStuff();
MyClass
が制御下にない場合、何らかのインターフェースを実装させることはできません。また、他のオプションはリフレクションに依存することです( このチュートリアルを参照 )。
リフレクションはかなり簡単だと思います
MyClass mobj = MyClass.class.cast(obj);
クラス名が異なる場合
Object newObj = Class.forName(classname).cast(obj);
オブジェクトは既にMyClassオブジェクトに変換されているため、変換する必要はありません。あなたが本当にやりたいことはそれをキャストすることですが、クラス名はコンパイル時に不明なので、そのクラスの変数を宣言できないため、それを行うことはできません。私の推測では、「ダックタイピング」のようなものが必要/必要です。つまり、クラス名はわかりませんが、コンパイル時にメソッド名はわかります。グレゴリーによって提案されたインターフェースは、それを行うための最善の策です。
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
return (T) obj;
}
mojb
がMyClass
型であることを知らなかった場合、どのようにしてその変数を作成できますか?
MyClassがインターフェイスタイプまたはスーパータイプである場合、キャストを行う必要はありません。