2017-05-24 3 views
0

Ich erstelle eine Reihe von POJOs und muss toString() Methoden für jedes erstellen. Anstatt jede von Hand zu codieren, dachte ich, es wäre einfacher, eine Klasse zu erstellen, um die Arbeit für mich mit der Reflektions-API zu erledigen - erstelle die Funktionalität an einem Ort und verwende sie in jedem POJO.Verwenden Sie Reflection-API, um Feldnamen und Werte zu erhalten

Alle Felder in den POJOs sind privat. Die POJOs sind Java-Objektdarstellungen von JSON-Objekten.

Die Anforderungen bestehen darin, die Felder einer Klasse zu durchlaufen und die Felder zusammen mit den Werten aufzulisten.

Ich teste derzeit die Funktionalität für eine Klasse namens ChannelResource.

Hier ist die Klasse, die ich verwende Feldnamen und Werte zur Liste:

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(); 
      } 
     } 
    }} 

Ich Gebe eine Instanz die ChannelResource Klasse für den Konstruktor.

Der Compiler nicht field.get(o) in dieser Zeile nicht mag:

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

Der Compiler sagt:

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

ToStringMaker funktioniert, wenn ich machen alle Mitglieder der Öffentlichkeit, aber ich würde wirklich lieber nicht tun, . Gibt es einen anderen Weg, um den Wert eines privaten Feldes zu erhalten?

Ich weiß, dass die Apache-Organisation etwas hat, das die ToString-Funktionalität erstellt, aber ich mag das Format nicht.

Antwort

0

Versuchen Sie, diese

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

, das funktioniert! Danke, mottaman85! –

Verwandte Themen