2017-05-24 20 views
0

私はいくつかのPOJOを作成しており、それぞれに対してtoString()のメソッドを作成する必要があります。それぞれを手作業でコーディングする代わりに、リフレクションAPIを使用して私の仕事をするクラスを作成する方が簡単だと考えました。機能を1か所で作成し、各POJOで使用します。リフレクションAPIを使用してフィールド名と値を取得する

POJOのすべてのフィールドはプライベートです。 POJOは、JSONオブジェクトのJavaオブジェクト表現です。

要件は、クラス内のフィールドをトラバースし、値とともにフィールドをリストすることです。

私は現在、ここChannelResource.

と呼ばれるクラス上の機能をテストしていますが、私はフィールド名と値をリストする使用しているクラスです。

import java.lang.reflect.Field; 
    public class ToStringMaker { 
     public ToStringMaker(Object o) { 

     Class<? extends Object> c = o.getClass(); 
     Field[] fields = c.getDeclaredFields(); 
     for (Field field : fields) { 
      String name = field.getName();    
      try { 
      System.out.format("%n%s: %s", name, field.get(o)); 
      } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
      } 
     } 
    }} 

私はのインスタンスを渡していますコンストラクタへのクラスChannelResource

コンパイラは、この行のfield.get(o)が好きではありません。

System.out.format("%n%s: %s", name, field.get(o)); 

コンパイラは言う:私はすべてのメンバーが公開する場合

java.lang.IllegalAccessException: Class ToStringMaker can not access a member of class ChannelResource with modifiers "private" 

ToStringMakerは動作しますが、私は本当に、むしろそれをしないだろう。プライベートフィールドの価値を得る別の方法はありますか?

私は、Apache組織にtoString機能を作成するものがあることは知っていますが、私はそのフォーマットが気に入らないのです。

答えて

0

が働くこの

import java.lang.reflect.Field; 
public class ToStringMaker { 
    public ToStringMaker(Object o) { 

    Class<? extends Object> c = o.getClass(); 
    Field[] fields = c.getDeclaredFields(); 
    for (Field field : fields) { 
     String name = field.getName(); 
    field.setAccessible(true);   
     try { 
     System.out.format("%n%s: %s", name, field.get(o)); 
     } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
     } 
    } 
}} 
+0

お試しください!ありがとう、mottaman85! –

関連する問題