最新帖子 精华区 社区服务 会员列表 统计排行
主题 : 利用反射重写toString()方法
mrsoft 离线
级别: 菜鸟
UID: 44315
精华: 0
发帖: 22
金币: 0 个
银元: 32 个
铜钱: 380 个
技术分: 0 个
在线时间: 4(时)
注册时间: 2017-01-09
最后登录: 2017-04-27
楼主  发表于: 2017-04-21   

利用反射重写toString()方法

为了方便输出对象,Object类提供了toString()方法。但是该方法的默认值是由类名和哈希码组成的,实用性并不强。通常需要重写该方法以提供更多的信息。本实例使用反射输出类的包、类的名字、类的公共构造方法、类的公共域和类的公共方法。在重写不同类的toString()方法时调用该方法就可以避免多次重写toString()方法。实例运行效果如图



编写类StringUtils,在该类中定义了两个方法:toString()方法用于输出类的公共方法、域等信息,main()方法用来进行测试。代码如下:

复制代码
  1. 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组件提供的工具类来重写该方法。

描述
快速回复

批量上传需要先选择文件,再选择上传
认证码:

验证问题:
printf("%d", 103)
按"Ctrl+Enter"直接提交