Objekt in der Systemout.txt ausgeben?

ZeroQool

Mitglied
Hallo,

ich habe selbstgeschriebene Objekte zB UserInfo. Nun möchte ich mein Objekt (Name & Value) in der Systemout reinschreiben bzgl Log. Hab irgendwo mal gesehen, dass es geht, aber ich weiss nciht mehr wo es war. Das ganze soll so allg. sein, dass ich ein x-beliebiges Objekt übergeben kann. Danke
 
ein System.out-Aufruf geht wie folgt:

System.out.println(text);

> Das ganze soll so allg. sein, dass ich ein x-beliebiges Objekt übergeben kann.
inwiefern? gib für jedes Objekt eben genau das aus was du möchstest

vielleicht sollen all die Klassen dieser Objekte selber bestimmen wie die Ausgabe läuft,
dann verwende ein gemeinsames Interface mit einer Methode, die das regelt,
die Methode muss jede Klasse korrekt implementieren,
und rufe allgemein nur die Methode auf

ganz allgemein in Object gibts schon
public String toString()
 
Eigentlich möchte ich alles ausgeben

Bsp:

Java:
public class ContactInfo
{
	/**
	 * Property
	 */
	protected String EMail;
	protected String PhonePre;
	protected String Phone;
	protected String MobilePre;
	protected String Mobile;
	protected String FaxPre;
	protected String Fax;
	
	/**
	 * Constructor
	 */	
	public ContactInfo(String mail, String phonePre, String phone, String mobilePre, String mobile, String faxPre, String fax)
	{
		super();
		EMail = mail;
		PhonePre = phonePre;
		Phone = phone;
		MobilePre = mobilePre;
		Mobile = mobile;
		FaxPre = faxPre;
		Fax = fax;
	}
	
	public ContactInfo()
	{
	}

	/**
	 * Getter/Setter
	 */
	public String getEMail()
	{
		return EMail;
	}
	public void setEMail(String mail)
	{
		EMail = mail;
	}
	public String getPhonePre()
	{
		return PhonePre;
	}
	public void setPhonePre(String phonePre)
	{
		PhonePre = phonePre;
	}
	public String getPhone()
	{
		return Phone;
	}
	public void setPhone(String phone)
	{
		Phone = phone;
	}
	public String getMobilePre()
	{
		return MobilePre;
	}
	public void setMobilePre(String mobilePre)
	{
		MobilePre = mobilePre;
	}
	public String getMobile()
	{
		return Mobile;
	}
	public void setMobile(String mobile)
	{
		Mobile = mobile;
	}
	public String getFaxPre()
	{
		return FaxPre;
	}
	public void setFaxPre(String faxPre)
	{
		FaxPre = faxPre;
	}
	public String getFax()
	{
		return Fax;
	}
	public void setFax(String fax)
	{
		Fax = fax;
	}
}

Ich möchte das Objekt "ContactInfo" einfach an eine Methode übergeben und diese gibt mir über System.out.println alle Propertys aus zB
.

Habe etliche Objekte und möchte mir den Aufwand sparen für jedes eine separate Print Methode schreiben. Geloggt soll vorerst alles....
 
tja, da hilft vielleicht ein externes Framework wie BeanUtils
BeanUtils (Commons BeanUtils 1.8.3 API)
in der Standard-API gibts das glaube ich nicht,

mit Reflection kann man das erreichen:
Class c = object.getClass();
und dann in der Klasse Class Methoden zu vorhandenen Feldern oder Methoden, diese durchlaufen (Array, Schleife),
Namen der Felder/ Methoden ausgeben, Werte vom vorhanderen Objekt abfragen usw.
 
Oder man schreibt sich dafür ne Methode in der Klasse wie z.B.
Code:
printAll()
oder so. Oder hab ich was falsch verstanden? Kannst ja einfach sowas machen:

Java:
public void printAll(ContactInfo ci) {
    if(ci.getEmail() != null)
        System.out.println("EMail " + ci.getEmail());
}
 
Hab es jetzt soweit so gelöst:
Java:
	public String toString()
	{
		StringBuffer buff = new StringBuffer();

		Field[] fields = this.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length; i++)
		{
			try
			{
				buff.append(fields[i].getName()).append("\t=>\t").append(fields[i].get(this)).append("\n");

				System.out.println("OBJECT: " + fields[i].getName() + " : values: " + fields[i].get(this));
			}
			catch (IllegalAccessException ex)
			{
				ex.printStackTrace(System.out);
			}
			catch (IllegalArgumentException ex)
			{
				ex.printStackTrace(System.out);
			}

		}
		return buff.toString();
	}

Funktioniert wunderbar, bis auf die verschachtelten Objekte zB

ystemOut O OBJECT: Bank : values: de.test.model.BankInfo@5a5a5a5a
 
Was funktioniert daran nicht?
Bzw. was ist an der Darstellung falsch..

Normalerweise müßte dort folgendes stehen:

[03.06.10 15:26:34:770 CEST] 00000026 SystemOut O OBJECT: AccountNumber : values: 12345
[03.06.10 15:26:34:770 CEST] 00000026 SystemOut O OBJECT: AccountOwner : values: Mustermann
[03.06.10 15:26:34:770 CEST] 00000026 SystemOut O OBJECT: BankID : values: 123456789

Hab es testweise so gelöst:
Java:
		System.out.println(pUserInfo.toString());
		System.out.println(pUserInfo.getBank().toString());
 
Vlt.
Java:
System.out.println("OBJECT: " + fields[i].getName() + " : values: " + fields[i].get(this));
in
Java:
System.out.println(buff.toString() + "OBJECT: " + fields[i].getName() + " : values: " + fields[i].get(this));

Oder war das extra so, bzw steht da was ganz anderes drin?
 

Zurück
Oben