web-dev-qa-db-ja.com

クラス名がわかっている場合、Java Objectクラスのオブジェクトを特定のクラスに動的に変換する

ええ、知っています。質問の長いタイトル...それで、文字列にクラス名があります。私はこの方法でこのクラスのオブジェクトを動的に作成しています:

String className = "com.package.MyClass";   
Class c = Class.forName(className);
Object obj = c.newInstance();

objMyClassオブジェクトに動的に変換するにはどうすればよいですか?私はこのように書くことはできません:

MyClass mobj = (MyClass)obj;

...classNameは異なる場合があるためです。

28
Pawka

呼び出したくないメソッドを宣言するインターフェイスを宣言しないでください:

public interface MyInterface
{
  void doStuff();
}

public class MyClass implements MyInterface
{
  public void doStuff()
  {
    System.Console.Writeln("done!");
  }
}

それからあなたは使う

MyInterface mobj = (myInterface)obj;
mobj.doStuff();

MyClassが制御下にない場合、何らかのインターフェースを実装させることはできません。また、他のオプションはリフレクションに依存することです( このチュートリアルを参照 )。

22
Gregory Pakosz

リフレクションはかなり簡単だと思います

MyClass mobj = MyClass.class.cast(obj);

クラス名が異なる場合

Object newObj = Class.forName(classname).cast(obj);
66
user2308814

オブジェクトは既にMyClassオブジェクトに変換されているため、変換する必要はありません。あなたが本当にやりたいことはそれをキャストすることですが、クラス名はコンパイル時に不明なので、そのクラスの変数を宣言できないため、それを行うことはできません。私の推測では、「ダックタイピング」のようなものが必要/必要です。つまり、クラス名はわかりませんが、コンパイル時にメソッド名はわかります。グレゴリーによって提案されたインターフェースは、それを行うための最善の策です。

3
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
    return (T) obj;
}
2
appmaster

mojbMyClass型であることを知らなかった場合、どのようにしてその変数を作成できますか?

MyClassがインターフェイスタイプまたはスーパータイプである場合、キャストを行う必要はありません。

2
Chii