2017-05-06 3 views
2

ジャクソンがオブジェクトを作成する方法は非常に興味があります。それは、セッターなしのプライベートプロパティ/フィールドだけでなく、空のコンストラクタを使用することです。ジャクソンはセッターなしでプライベートプロパティをどのように設定しますか?

私が求めている理由は、特定のプロパティをデシリアライズすると、これらの値に基づいて他のプロパティを自動的に設定したいということです。たとえば、イメージをシリアル化するのではなく、パスだけをシリアル化することができます。パスがデシリアライズされると、@JsonIgnoreフィールドImageは実際のイメージをロードできます。デシリアライズされたオブジェクトの構築後、フィールドはまだ割り当てられていません。そしてゲッターは論理的に呼び出されていません。だから、どのようなブードゥーの魔法が私のオブジェクトのプライベートな部分に触れているのですか?

public class ItemTemplate { 

    private String imagePath; 

    public ItemTemplate() { 
     System.out.println(imagePath); //Still null 
    } 

    public String getImagePath() { 
     System.out.println(imagePath); //Not being called when deserializing. 
     return imagePath; 
    } 
} 

しかし、ジャクソンが、それはそれはimagePathセットのしているこのオブジェクトをデシリアライズ行われます。

+1

リフレクションを使用して、プライベートフィールドにアクセス可能にした後。 http://stackoverflow.com/questions/1555658/is-it-possible-in-java-to-access-private-fields-via-reflection –

+0

@JBNizetそれは素晴らしいトリックです。そして、それは私のためのトリックを行うプライベートセッターを作りました。今はパスが公開されていないので、他のプロパティを設定することができます。それは私のフォローアップの質問に間接的に答えました。ありがとう。 – Madmenyo

答えて

2

最初のコメントはタイトルの質問に回答しました。 Jacksonはreflection to access private and protected propertiesを使用します。これは何とか私にimagePathフィールドのプライベートセッターを試してもらいました。このセッターは、フィールドに直接アクセスするのではなく、ジャクソンによって使用されます。このセッターの中で、私はパス文字列を使って実際のイメージを設定することができ、それでもプライベートなままです。

関連する問題