Wednesday, 4 January 2012

A Simple Property Viewer with Reflection and ZK

Sometimes I need to display a POJO’s properties/attributes. These POJOs may contain dozens of properties making it tedious to invoke all the getXxx() methods. So Java Reflection is a perfect candidate for such a use case.
In the following example, the LoginResponse class contains dozens of fields that I want to display. The formatMethodName() method beautifies the getXxx() method names into more human user friendly names.
import java.lang.reflect.Method;
import com.laws.acc.ws.*;
import com.laws.acc.model.*;

LoginResponse loginResponse=AccSoapClientProxy.getLoginResponse();
void populateRows() {  
	if(loginResponse!=null) {
		Method[] methods = LoginResponse.class.getDeclaredMethods();
		for(int i=0; i<methods.length; i++) {
			
			
			Method method=methods[i];
			//Object arglist[]={};
			if(method.getName().startsWith("get")) {
				Row row=new Row();
				Label label=new Label(formatMethodName(method.getName()));
				label.setStyle("font-style: italic;");
				label.setParent(row);
				new Label(method.invoke(loginResponse, null).toString()).setParent(row);
				row.setParent(rows);
			}
		}
	}
}
/**
 * turn strings such as 'getUserName' into 'User Name'
 */
private String formatMethodName(String name) {
	// the method name should start with 'get' followed by the property name
	// otherwise, ignore the method.
	if(name==null || name.length()<4) return null;
	StringBuffer sb=new StringBuffer();
	
	// skip the first 3 characters, they are 'get'
	for(int i=3; i<name.length(); i++) {
		char ch = name.charAt(i);
		if(i>3 && ch>='A' && ch<='Z') {
			sb.append(" ");
		}
		sb.append(ch);
	}
	return sb.toString().replace("Id", "ID").replace("Dt", "Timestamp").replace("Lre", "LRE").replace("Mvno", "MVNO");
	
}
The GUI component I am using is a ZK Grid with each row showing a property value.


	
// put the above java code here.

	

populateRows();

0 comments: