利用反射重寫toString()方法


為了方便輸出對象,Object類提供了toString()方法。但是該方法的默認值是由類名和哈希碼組成的,實用性並不強。通常需要重寫該方法以提供更多的信息。本實例使用反射輸出類的包、類的名字、類的公共構造方法、類的公共域和類的公共方法。在重寫不同類的toString()方法時調用該方法就可以避免多次重寫toString()方法。實例運行效果如圖

編寫類StringUtils,在該類中定義了兩個方法:toString()方法用於輸出類的公共方法、域等信息,main()方法用來進行測試。代碼如下:

 

package com.mingrisoft.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class StringUtils {
    @SuppressWarnings("unchecked")
    public String toString(Object object) {
        Class clazz = object.getClass();// 獲得代表該類的Class對象
        StringBuilder sb = new StringBuilder(); // 利用StringBuilder來保存字符串
        Package packageName = clazz.getPackage(); // 獲得類所在的包
        sb.append("包名:" + packageName.getName() + "\t");// 輸出類所在的包
        String className = clazz.getSimpleName(); // 獲得類的簡單名稱
        sb.append("類名:" + className + "\n"); // 輸出類的簡單名稱
        sb.append("公共構造方法:\n");
        // 獲得所有代表構造方法的Constructor數組
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            String modifier = Modifier.toString(constructor.getModifiers());// 獲得方法修飾符
            if (modifier.contains("public")) {// 查看修飾符是否含有“public”
                sb.append(constructor.toGenericString() + "\n");
            }
        }
        sb.append("公共域:\n");
        Field[] fields = clazz.getDeclaredFields();// 獲得代表所有域的Field數組
        for (Field field : fields) {
            String modifier = Modifier.toString(field.getModifiers());
            if (modifier.contains("public")) {// 查看修飾符是否含有“public”
                sb.append(field.toGenericString() + "\n");
            }
        }
        sb.append("公共方法:\n");
        Method[] methods = clazz.getDeclaredMethods();// 獲得代表所有方法的Method[]數組
        for (Method method : methods) {
            String modifier = Modifier.toString(method.getModifiers());
            if (modifier.contains("public")) {// 查看修飾符是否含有“public”
                sb.append(method.toGenericString() + "\n");
            }
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
        System.out.println(new StringUtils().toString(new Object()));
    }
}

 

心法領悟:簡化toString()方法的重寫。

toString()在編寫類時基本都需要重寫,對於高手而言,可以使用反射來自定義需要的輸出結果。對於日常開發,推薦大家使用Commons Lang組件提供的工具類來重寫該方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM