| « | December 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | |
| 公告 |
|
| Blog信息 |
|
blog名称:流浪狗 日志总数:44 评论数量:19 留言数量:-2 访问次数:194062 建立时间:2008年3月13日 |

| |
|
[JAVA]toString方法实现(JAVA2核心技术学习) 软件技术
流浪狗 发表于 2008/3/28 14:03:42 |
| package com.cool.reflect;
import java.lang.reflect.*;import java.util.*;import java.text.*;
public class ObjetAnalyzerTest { public static void main(String args[]) { ArrayList<Integer> squares = new ArrayList<Integer>(); for (int i = 1; i <= 5; i++) squares.add(i*i); System.out.println(new ObjectAnalyzer().toString(squares)); }}
class ObjectAnalyzer{ public String toString(Object obj){ if(obj==null) return "null"; if(visited.contains(obj)) return "..."; visited.add(obj); Class c1 = obj.getClass(); if(c1==String.class)return (String)obj; if(c1.isArray()){ //返回表示数组组件类型的 Class。 String r = c1.getComponentType() + "[]{"; for(int i=0;i<Array.getLength(obj);i++){ if(i>0) r+=","; Object val= Array.get(obj, i); if(c1.getComponentType().isPrimitive()) r +=val; else r += toString(val); } return r+"}"; } String r = c1.getName(); do{ r += "["; //返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。 Field[] fields = c1.getDeclaredFields(); //使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。 AccessibleObject.setAccessible(fields, true); for(Field f: fields){ // 如果参数包括 static 修饰符,则返回 true,否则返回 false。 if(!Modifier.isStatic(f.getModifiers())){ if(!r.endsWith("[")) r +=","; r +=f.getName() + "="; try{ //返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型 Class t = f.getType(); //返回指定对象上此 Field 表示的字段的值。 Object val = f.get(obj); //判定指定的 Class 对象是否表示一个基本类型 if(t.isPrimitive()) r +=val; //递归 else r +=toString(val); }catch(Exception e){ e.printStackTrace(); } } } r +="]"; c1=c1.getSuperclass(); }while(c1!=null); return r; } private ArrayList<Object> visited = new ArrayList<Object>();}
输出结果:java.util.ArrayList[elementData=class java.lang.Object[]{java.lang.Integer[value=1][][],java.lang.Integer[value=4][][],java.lang.Integer[value=9][][],java.lang.Integer[value=16][][],java.lang.Integer[value=25][][],null,null,null,null,null},size=5][modCount=5][][] |
|
|