Javaでオブジェクトを作成することについての知識のポイントを見つけました、そしてそれをすぐに書き留めるのが怖かったです

Javaはオブジェクト指向プログラミングであることを私たちは知っています。レトリックとは何ですか?すべてがオブジェクトです!

プロパティ(非静的)を表示したいのですが、確認方法は?オブジェクトが欲しい!

メソッド(非静的)を呼び出したいのですが、どのように呼び出しますか?オブジェクトが欲しい!

オブジェクトはありません、それはひどいです!o(╥﹏╥)o、何もできません~~

ですから、物がなければ新しいものを作ります!オブジェクトがない場合は、オブジェクトを作成します。

これがオブジェクトの作成です。今日はそれについて話しましょう。そのような「オブジェクト」があれば、オブジェクトは必要ありません。これを見てください!

1.キーワードnewを使用します

Classクラスを作成する場合、実際には、デフォルトでパラメーターを使用せずにコンストラクターを作成します。もちろん、必要に応じて構築メソッドをオーバーロードすることもできるので、デフォルトのパラメータなし構築メソッドは当然無効です。現時点では、パラメータなし構築メソッドを呼び出す場合は、別のパラメータなし構築メソッドしか記述できません。手作業によるパラメータ構築方法。前のコードを見てください(* ^▽^ *)。

public class BeautifulGirl {

    private Integer age;

    private String height;

    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

電話しましょう

 public static void main(String[] args) throws Exception {
        BeautifulGirl beautifulGirl = new BeautifulGirl();
        beautifulGirl.setAge(20);
        beautifulGirl.setHeight("175cm");
        System.out.println(JSON.toJSONString(beautifulGirl));
    }

//输出
//{"age":20,"height":"175cm"}

もちろん、これは私にとっては問題ありません。これは、オブジェクトを取得するために最も一般的に使用される方法でもあります。ただし、一部のオブジェクトパラメータは空にできません。たとえば、このBeautifulGirlには名前を付ける必要があるため、構築メソッドがオーバーロードされます。

   public BeautifulGirl(String name) {
        this.name = name;
    }

このとき、初めての場合はパラメータを書き込む必要があります。そうしないと、BeautifulGirlのBeautifulGirl(String)を()に適用できないため、一般に、構築メソッドをオーバーロードすると、パラメータなしの構築メソッドも作成されます。どこかに新しいオブジェクトが欲しいのを防ぐために書かれていますが、新しいものは出てきません、ハハハ。

2.リフレクションを使用する

それでもこのBeautifulGirlは、newを使用せず、javaのリフレクションを使用してこのオブジェクトを構築します。

public static void main(String[] args) throws Exception {
        Class<?> bClass = Class.forName("com.pindao.ehr.center.operateVO.BeautifulGirl");
        Object o = bClass.newInstance();
        if (o instanceof BeautifulGirl) {
            BeautifulGirl beautifulGirl = (BeautifulGirl) o;
            beautifulGirl.setAge(20);
            System.out.println("beautifulGirl:"+JSON.toJSONString(beautifulGirl));
        }
    }

え?エラーを報告しますか?この種の基本的な反射にはまだ問題がありますか?投稿して見る

Exception in thread "main" java.lang.InstantiationException: com.pindao.ehr.center.operateVO.BeautifulGirl
	at java.lang.Class.newInstance(Class.java:427)
	at com.pindao.ehr.center.operateVO.TempTest.main(TempTest.java:9)
Caused by: java.lang.NoSuchMethodException: com.pindao.ehr.center.operateVO.BeautifulGirl.<init>()
......

ご覧のとおり、エラーが報告される場所はnewInstanceであり、プロンプトはNoSuchMethodExceptionであり、そのようなメソッド例外はありません。ああ、このクラスをインスタンス化するメソッドがないことがわかりました。インスタンス化はコンストラクターを呼び出すだけではありませんか?よく見てください、ねえ、構築メソッドは私によってオーバーロードされています、それはパラメータレスではありません、newInstanceは明らかにパラメータレス構築メソッドだけを必要とします!とても怖かったので、すぐにパラメータのない工法を追加しました。

もう一度走らせて、20歳の美少女が出ました!

{"age":20}

Process finished with exit code 0

もちろん、リフレクションを使用して文言を変更することも可能です

         ClassLoader loader = ClassLoader.getSystemClassLoader();
                  Class<?> aClass = 
                  loader.loadClass("com.pindao.ehr.center.operateVO.BeautifulGirl");
        Object o = aClass.newInstance();
        if (o instanceof BeautifulGirl) {
            BeautifulGirl beautifulGirl = (BeautifulGirl) o;
        }
        
        //--------------------------------------------------------

        BeautifulGirl t = new BeautifulGirl();
        
        Class<? extends BeautifulGirl> aClass1 = t.getClass();
        BeautifulGirl beautifulGirl = aClass1.newInstance();

3. Clone()とシリアル化

clone()メソッドは誰にとっても少し奇妙かもしれませんが、誰もがObjectクラスに精通していますよね?Objectはすべてのクラスの親クラスであり、Objectには、equals、wait、notify、toStringなどの独自のメソッドがいくつかあります。オブジェクトはObjectを継承するため、Cloneメソッドを書き直して新しいオブジェクトを作成するのは自然ですが、これもオブジェクトから呼び出す必要があります。また、メソッドを書き直す必要があります。これはあまり使用しないでください。

シリアル化もあります。この場合、シリアル化インターフェイスSerializableを実装する必要があります。一部のRPC呼び出しとパラメータ受信は、すべてシリアル化および逆シリアル化されます。これについてはここでは詳しく説明しません。多すぎます。興味がある場合は、シリアル化と逆シリアル化を確認できます。

4.安全でないものを使用する

新規、リフレクション、クローンのいずれの場合でも、一部のシリアル化メソッドでも、オブジェクトのパラメーターなしの構築メソッドを使用する必要があります。パラメーターなしの構築メソッドがない場合、このBeautifulGirlオブジェクトは自然に存在しなくなるため、私はBeautifulGirlオブジェクトが必要な場合はどうすればよいですか?

心配しないでください、トリックがあります!

オブジェクトBeautifulGirlは実行できません!

安全でないツールキットもあります!反射を使用して、BeautifulGirlオブジェクトを直接見つけます!

これらのメソッドの例の構築はGsonにカプセル化されているので、書き直しません。効果を見てみましょう。

 public static void main(String[] args) throws Exception {

        Map<Type, InstanceCreator<?>> instanceCreators = new HashMap<>();
        ConstructorConstructor constructorConstructor = new ConstructorConstructor(instanceCreators);

        ObjectConstructor<BeautifulGirl> constructor = constructorConstructor.get(TypeToken.get(BeautifulGirl.class));
        BeautifulGirl beautifulGirl = constructor.construct();
        beautifulGirl.setName("jingjing");
        beautifulGirl.setAge(20);
        beautifulGirl.setHeight("175cm");
        System.out.println(JSON.toJSONString(beautifulGirl));
    }

実行結果(パラメーター構造はカバーされていません):

{"age":20,"height":"175cm","name":"jingjing"}

Process finished with exit code 0

興味があれば、Gsonのソースコードを見に行くことができます。今日はこれで終わりです。続けて、安全ではないことを確認してください。o(*  ̄︶ ̄ *)o

犠牲もベクトルもありません!

おすすめ

転載: blog.csdn.net/zsah2011/article/details/112557331