ソースドキュメント:https://www.cnblogs.com/wxd0108/p/5685817.html
Javaでオブジェクトを作成する5つの方法
- newは新しいオブジェクトを作成します
- 反射メカニズム(クラスとコンストラクター)を介して
- クローンメカニズムの使用
- シリアル化メカニズムを介して
newは新しいオブジェクトを作成します
これは、オブジェクトを作成するための最も一般的で最も簡単な方法です。このようにして、任意のコンストラクターを呼び出すことができます(引数なしと引数ありの両方)。
Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee
3: dup
4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V
反射メカニズムを介して
-
ClassクラスのnewInstanceメソッドを使用します
ClassクラスのnewInstanceメソッドを使用してオブジェクトを作成することもできます。newInstanceメソッドは、パラメーターなしのコンストラクターを呼び出してオブジェクトを作成します。
次の方法でnewInstanceメソッドを呼び出すことにより、オブジェクトを作成できます。
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
或者
Employee emp2 = Employee.class.newInstance();
51: invokevirtual #70 // Method java/lang/Class.newInstance:()Ljava/lang/Object;
-
コンストラクタークラスのnewInstanceメソッドを使用します
ClassクラスのnewInstanceメソッドと同様に、java.lang.reflect.Constructorクラスにもオブジェクトを作成するためのnewInstanceメソッドがあります。このnewInstanceメソッドを使用して、パラメーター化されたプライベートコンストラクターを呼び出すことができます。
Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
111: invokevirtual #80 // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
これらの2つのnewInstanceメソッドは、リフレクションと呼ばれるものです。実際、ClassのnewInstanceメソッドは、ConstructorのnewInstanceメソッドを内部的に呼び出します。これが、Spring、Hibernate、Strutsなどの多くのフレームワークが後者を使用する理由です。
クローンメカニズムの使用
オブジェクトのcloneメソッドを呼び出すたびに、jvmは新しいオブジェクトを作成し、前のオブジェクトのすべてのコンテンツをそのオブジェクトにコピーします。cloneメソッドを使用してオブジェクトを作成しても、コンストラクターは呼び出されません。
cloneメソッドを使用するには、最初にCloneableインターフェースを実装し、それによって定義されたcloneメソッドを実装する必要があります。
Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/
シリアル化メカニズムを介して
オブジェクトをシリアル化および逆シリアル化すると、jvmは別のオブジェクトを作成します。デシリアライズする場合、jvmはオブジェクトを作成し、コンストラクターを呼び出しません。
オブジェクトを逆シリアル化するには、クラスにSerializableインターフェースを実装させる必要があります
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();
261: invokevirtual #118 // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;
上記のバイトコードスニペットからわかるように、最初のメソッドを除いて、他の4つのメソッドはすべてinvokevirtual(オブジェクトを作成する直接メソッド)に変換され、最初のメソッドはnewとinvokespecial(コンストラクタ転送)。