`
lguoqing1001
  • 浏览: 47767 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

利用Java Reflect机制编写万能toString()方法

阅读更多

package com.accp.test.filed;

 

import java.lang.reflect.AccessibleObject;

import java.lang.reflect.Array;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

import java.util.ArrayList;

import java.util.List;

 

public class ObjectAnalyzer {

 

    private List<Object> visited = new ArrayList<Object>();

 

    public String toString(Object obj) {

 

       if (obj == null)

           return null// 如果obj为空..返回null

       if (visited.contains(obj))

           return "..."// 如果visited中已经包含obj,返回...

 

       visited.add(obj);

 

       Class c1 = obj.getClass(); // 得到运行时对象

 

       if (c1 == String.class)

           return (String) obj; // 如果c1String类型,直接转换

 

       if (c1.isArray()) { // 如果是数组类型

           String r = c1.getComponentType() + "[]{"// 得到该数组组件类型的Class

 

           for (int i = 0; i < Array.getLength(obj); i++) {

              if (i > 0)

                  r += ",";

              Object var = Array.get(obj, i); // 取得obj[i]元素的值

              if (c1.getComponentType().isPrimitive()) // 如果为基本类型

                  r += var;

              else

                  r += toString(var); // 递归调用

           }

           return r + "}";

       }

 

       String r = c1.getName(); // 得到obj名称

 

       // 检查本类域和所有超类域

       do {

           r += "[";

           Field[] fields = c1.getDeclaredFields(); // 得到本类和超类所有域

           AccessibleObject.setAccessible(fields, true); // 将所有域设置为可访问的.

 

           for (Field field : fields) {

              if (!Modifier.isStatic(field.getModifiers())) {

                  if (!r.endsWith("["))

                     r += ",";

                  r += field.getName() + "=";

 

                  try {

                     Class type = field.getType(); // 得到字段类型

                     Object var = field.get(obj);   //设置值

                     if (type.isPrimitive())   //判断是否为基本类型

                         r += var;

                     else

                         r += toString(var);

                  } catch (Exception e) {

                     e.printStackTrace();

                  }

              }

           }

           r+="]";

           c1 = c1.getSuperclass();

       } while (c1 != null);

 

       return r;

 

    }

}

分享到:
评论

相关推荐

    Java reflect 机制详解

    免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者

    JavaReflect

    在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的`Constructor`、`Method`和`Field`等类。通过反射,我们可以动态地获取类的信息(如类名、属性、方法),甚至可以在运行时创建和调用类的...

    java reflect

    Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至在没有它们的实例的情况下调用方法和构造器。这个特性在处理动态类型、元编程、插件系统、以及许多其他高级编程场景中...

    最好的java对象ToString处理方案,ToString基类

    1. **反射机制**:利用`java.lang.reflect.Field`类获取类的所有字段。 2. **字段过滤**:允许用户指定要排除的字段名,这些字段不会出现在`toString`结果中。 3. **格式化输出**:提供定制化的格式化选项,如字段名...

    java教程ppt,讲述了java reflect.,对大家应该很有帮助

    Java反射机制是在运行时分析类的能力,包括访问类的信息(如类名、方法名、参数类型等)、创建对象、调用方法和修改属性值。这种能力使得代码具有更高的灵活性和动态性,能够在编译时未知的情况下操作对象。 1. **...

    java面试题--反射机制

    Java反射机制主要依赖于`java.lang.reflect`包下的API,其中包括: - `java.lang.Class`:表示一个类的运行时信息。 - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Field`:表示类的字段。 -...

    JAVA_Reflect

    Java反射是Java编程语言中的一个重要特性,它允许运行时的Java程序访问、操作类和对象的内部信息,包括类名、方法名、参数类型等,甚至可以动态调用方法和改变对象状态。这个特性在很多场景下都非常有用,如框架开发...

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    Java反射机制 Java反射机制

    Java反射机制主要通过`java.lang.reflect`包下的API实现,其中最重要的类包括: - `Class`:代表一个类,是所有反射操作的基础。 - `Method`:表示类中的一个方法。 - `Constructor`:表示类中的一个构造函数。...

    java中的反射reflect

    Java中的反射(Reflect)是Java语言的一个重要特性,它允许运行时访问类的信息,包括类名、属性、方法等,并可以动态地创建对象和调用方法。反射在很多场景下非常有用,比如在框架开发、插件系统、元数据驱动编程等...

    java反射机制详解

    Java 反射机制是 Java 语言中一个强大的功能,允许开发者在运行时动态地获取类的信息和调用对象的方法。通过 Java 反射机制,开发者可以在运行时判断任意一个对象所属的类、构造任意一个类的对象、判断任意一个类所...

    java反射机制,调用私有方法

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...

    Java反射机制

    8. **动态创建代理类**:利用`java.lang.reflect.Proxy`类可以动态生成并使用代理类。 9. **分析Java反射Class类型的源代码**:深入理解反射机制的工作原理,了解Class文件的结构以及JVM如何加载类对象以支持反射...

    候捷谈Java反射机制

    Java反射的核心在于`java.lang.Class`类,以及`java.lang.reflect`包中的`Method`、`Field`和`Constructor`等类。`Class`类非常特殊,它代表了运行时的Java类和接口,包括枚举、数组、原始Java类型和void关键字。每...

    java reflect utils

    `java reflect utils`通常是指一些工具类或库,用于简化和增强Java反射机制的使用。在Java编程中,反射机制主要用于在运行时动态地获取类的信息(如类名、属性、方法等)以及创建和调用对象。 **1. Java反射的基本...

    什么是java中的反射机制(reflect).docx

    Java 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许在运行时判断任意一个对象所属的类、在运行时构造任意一个类的对象、在运行时判断任意一个类所具有的成员变量和方法、在运行时调用...

    Java反射机制的实现_Reflection

    通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及执行其他动态操作。这一机制为Java提供了高度的灵活性和强大的元数据访问能力,尤其是在框架、插件系统和...

Global site tag (gtag.js) - Google Analytics