Java対応の各クラスの属性と対応する値を印刷

2419 ワード

ログを印刷する過程で、親クラスのtoStringメソッドを複写する必要があることがよくあります.属性名と属性値を1つずつスペルすると、コードは非常に冗長になり、重複性が大きくなります.反射に従って迅速に取得できます.
例えば私たちのbeanクラスでは、コアはtoStringメソッドにあります.
public class Bean {
	
	private String name = "abc";
	
	private String age = "15";
	
	private boolean success = true;
	
	private Long money = 5000L;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public boolean isSuccess() {
		return success;
	}

	public void setSuccess(boolean success) {
		this.success = success;
	}

	public Long getMoney() {
		return money;
	}

	public void setMoney(Long money) {
		this.money = money;
	}

	@Override
	public String toString(){
		//         
		StringBuffer result = new StringBuffer();
		try {
			//       Class
			Class extends Bean> clazz = this.getClass();
			
			//           
			Field [] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				
				//          
				String fieldName = field.getName();
				
				//               
				if ("serialVersionUID".equals(fieldName)) {
					continue;
				}
				
				//        ,     boolean     
				Class> type = field.getType();
				
				// boolean    is,   get
				String methodName = (type.getTypeName().equals("boolean")?"is":"get")
						+ fieldName.substring(0,1).toUpperCase() 
                        + fieldName.substring(1, fieldName.length());
				
				Method method;
				java.lang.Object resultObj;
				
				//            
				method = clazz.getMethod(methodName);
				
				//           
				resultObj = method.invoke(this);
				
				//                 
				if (resultObj != null && !"".equals(resultObj)) {
					result.append("[").
                         append(fieldName).append("]").append(resultObj).append(" ");
				}
			}
		} catch (SecurityException | NoSuchMethodException | IllegalAccessException 
              | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
		return result.toString();
	}
}

テストコード:
	public static void main(String[] args) {
		Bean bean = new Bean();
		System.out.println(bean.toString());
	}

実行結果:
[name]abc [age]15 [success]true [money]5000