オブジェクトをインスタンス化するにはどのような方法がありますか?

PHPz
リリース: 2020-09-05 10:33:51
オリジナル
9056 人が閲覧しました

オブジェクトをインスタンス化する方法は次のとおりです: 1. new キーワードを使用します。 2. Class クラスの newInstance メソッドを使用します。 4. clone メソッドを使用します。デシリアライゼーションを使用します。

オブジェクトをインスタンス化するにはどのような方法がありますか?

オブジェクトをインスタンス化するいくつかの方法

1. 新しいキーワードを使用する

これは、オブジェクトを作成する最も一般的で最も簡単な方法です。このようにして、任意のコンストラクター (パラメーターなしおよびパラメーター化されたもの) を呼び出すことができます。

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
ログイン後にコピー

2. 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;
ログイン後にコピー

3. Constructor クラスの 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 などの多くのフレームワークが後者を使用する理由でもあります。

4. clone メソッドを使用します

オブジェクトの clone メソッドを呼び出すたびに、JVM は新しいオブジェクトを作成し、前のオブジェクトの内容をすべてコピーします。 。 入る。 clone メソッドを使用してオブジェクトを作成しても、コンストラクターは呼び出されません。

clone メソッドを使用するには、まず Cloneable インターフェイスを実装し、その定義された clone メソッドを実装する必要があります。

Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87  // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;
ログイン後にコピー

5. 逆シリアル化を使用する

オブジェクトをシリアル化および逆シリアル化すると、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 つのメソッドもすべて

最初のメソッドは、new と invokespecial (コンストラクター呼び出し) の 2 つの呼び出しに変換されます。

次の Java プログラムでは、5 つの方法で Employee オブジェクトを作成します。これらのコードは GitHub から見つけることができます

public class ObjectCreation {
    public static void main(String... args) throws Exception {
        // By using new keyword
        Employee emp1 = new Employee();
        emp1.setName("Naresh");
        System.out.println(emp1 + ", hashcode : " + emp1.hashCode());
        // By using Class class&#39;s newInstance() method
        Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                               .newInstance();
        // Or we can simply do this
        // Employee emp2 = Employee.class.newInstance();
        emp2.setName("Rishi");
        System.out.println(emp2 + ", hashcode : " + emp2.hashCode());
        // By using Constructor class&#39;s newInstance() method
        Constructor<Employee> constructor = Employee.class.getConstructor();
        Employee emp3 = constructor.newInstance();
        emp3.setName("Yogesh");
        System.out.println(emp3 + ", hashcode : " + emp3.hashCode());
        // By using clone() method
        Employee emp4 = (Employee) emp3.clone();
        emp4.setName("Atul");
        System.out.println(emp4 + ", hashcode : " + emp4.hashCode());
        // By using Deserialization
        // Serialization
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));
        out.writeObject(emp4);
        out.close();
        //Deserialization
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
        Employee emp5 = (Employee) in.readObject();
        in.close();
        emp5.setName("Akash");
        System.out.println(emp5 + ", hashcode : " + emp5.hashCode());
    }
}
ログイン後にコピー

推奨関連記事とチュートリアル: Java 入門

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート