web-dev-qa-db-ja.com

Javaで名前でクラスをインスタンス化する方法はありますか?

私は質問を探していました: 文字列名からクラスをインスタンス化する これは、名前を持つときにクラスをインスタンス化する方法を説明します。 Javaでそれを行う方法はありますか?パッケージ名とクラス名があり、その特定の名前を持つオブジェクトを作成できる必要があります。

88
ict1991

二つの方法:

方法1-引数なしのコンストラクターを持つクラスのみ

クラスに引数なしのコンストラクタがある場合、Class.forName()を使用してClassオブジェクトを取得し、newInstance()メソッドを使用してインスタンスを作成できます(ただし、このメソッドは多くの場合 考慮された悪 Javaのチェックされた例外を無効にすることができるため)。

例えば:

Class<?> clazz = Class.forName("Java.util.Date");
Object date = clazz.newInstance();

方法2

クラスに引数なしのコンストラクタがない場合にも機能する別のより安全なアプローチは、クラスオブジェクトを照会してConstructorオブジェクトを取得し、このオブジェクトでnewInstance()メソッドを呼び出すことです。

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

どちらの方法も reflection として知られています。通常、次のようなものを含む、発生する可能性のあるさまざまな例外をキャッチする必要があります。

  • jVMがクラスを見つけられないか、ロードできません
  • インスタンス化しようとしているクラスには、適切な種類のコンストラクタがありません
  • コンストラクター自体が例外をスローした
  • 呼び出そうとしているコンストラクタはパブリックではありません
  • セキュリティマネージャーがインストールされており、リフレクションの発生を防止している
213
Simon Nickerson
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
14
scibuff

use Class.forName( "クラスの文字列名").newInstance();

Class.forName("A").newInstance();

これにより、Aという名前のクラスが初期化されます。

3
Chandra Sekhar

Class.forName(...)を使用してインスタンスを作成するためにクラスの完全修飾名を取得しやすくするために、Class.getName()メソッドを使用できます。何かのようなもの:

class ObjectMaker {
    // Constructor, fields, initialization, etc...
    public Object makeObject(Class<?> clazz) {
        Object o = null;

        try {
            o = Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            // There may be other exceptions to throw here, 
            // but I'm writing this from memory.
            e.printStackTrace();
        }

        return o;
    }
}

次に、makeObject(...)に渡すクラスに戻すオブジェクトをキャストできます。

Data d = (Data) objectMaker.makeObject(Data.class);
2
Roberto

Java反射を使用

新しいオブジェクトの作成コンストラクターの呼び出しは新しいオブジェクトの作成と同等であるため、コンストラクターのメソッド呼び出しに相当するものはありません(最も正確には、新しいオブジェクトの作成にはメモリの割り当てとオブジェクトの構築の両方が含まれます)。したがって、前の例に最も近いものは次のとおりです。

import Java.lang.reflect.*;

   public class constructor2 {
      public constructor2()
      {
      }

      public constructor2(int a, int b)
      {
         System.out.println(
           "a = " + a + " b = " + b);
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("constructor2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Constructor ct 
              = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = ct.newInstance(arglist);
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

オブジェクトの新しいインスタンスを作成するために、指定されたパラメータータイプを処理して呼び出すコンストラクターを見つけます。このアプローチの価値は、コンパイル時ではなく、実行時にコンストラクターの検索と呼び出しを行う、純粋に動的なことです。

1
kornero

Class.forName( "ClassName") は目的を解決します。

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
1
String str = (String)Class.forName("Java.lang.String").newInstance();
0
Chen Harel

このような何かが動作するはずです...

String name = "Test2";//Name of the class
        Class myClass = Class.forName(name);
        Object o = myClass.newInstance();
0
Shashank Kadne