利用反射重写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组件提供的工具类来重写该方法。
利用反射重写toString()方法的更多相关文章
- 重写toString()方法来描述一个类
package com.zch.test; /* toString方法以及重写toString方法 toString方法是一个自我描述方法 方法本身返回的是该对象的实现类的 类名 + @ + hash ...
- C#...何时需要重写ToString()方法?
一般类型,都是继承自System.Object类,默认情况下,object类的ToString方法会返回当前类的类型的字符串表达形式.但也有例外!! DateTime,它就重写ToString方法,D ...
- [非技术参考]C#重写ToString方法
C# 中的每个类或结构都隐式继承 Object 类. 因此,C# 中的每个对象都会获得 ToString 方法,此方法返回该对象的字符串表示形式. 例如,所有 int 类型的变量都有一个 ToStri ...
- Effective Java 第三版——12. 始终重写 toString 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- java 中重写toString()方法
toString()方法 一般出现在System.out.println(类名.toString()); toString()是一种自我描述方法 本身返回的是 getClass().getName() ...
- java重写toString方法
在输出对象属性时,重写toString按照你希望的输出形式重写 object类里的toString只是把字符串的直接打印,数字的要转化成字符再打印,而对象,则直接打印该对象的hash码.所以当你要想按 ...
- java实体类如果不重写toString方法,会如何?
先认识一下Object Object 类的 toString 方法 返回一个字符串,该字符串由类名(对象是该类的一个实例).at 标记符“@”和此对象哈希码的无符号十六进制表示组成.换句话说,该方法返 ...
- 【java基础】为什么重写toString()方法?
不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来 ...
- java继承 、方法重写、重写toString方法
1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...
随机推荐
- react 服务器端渲染 ssr 中 localstorage/history/window is not defined 解决方案
1.原因 ssr 会在后端执行组件的 componentWillMount 以及在它这个生命周期之前的生命周期 也就是说 ssr 阶段是不会执行 componentDidMount 方法的 当你在 c ...
- jQuery的DOM操作之捕获和设置
.html()--获取或设置目标元素内的全部内容,包括html的标签及属性在内: .text()--仅获取或设置目标元素内的文本内容. .val()--获取输入框的值: .attr()--获取或设置目 ...
- python实现同服站点地址获取
说明:程序使用http://s.tool.chinaz.com/same此站点查询的结果.使用python简单的实现抓取结果 先随便查询一个结果,抓包分析,如图: 使用python模仿post表单,使 ...
- C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别
C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye { //私有的构造函数,保证外部不能实例化 private ...
- C++求解数组中出现超1/4的三个数字。
#include <iostream> using namespace std; //求x!中k因数的个数. int Grial(int x,int k) { int Ret = 0; w ...
- Cocos2d-x学习笔记(12)(CCControlSwitch开关、CCControlSlider滑动条、CCControlButtonbutton)
CCEditBox.CCControlSwitch.CCControlSlider.CCControlColourPicker.CCControlButton等都是Cocos2d-x 2.x的最新UI ...
- Python爬虫开发【第1篇】【urllib2】
1.urlopen # urllib2_urlopen.py # 导入urllib2 库 import urllib2 # 向指定的url发送请求,并返回服务器响应的类文件对象,urlopen中有da ...
- cesm下载备注
新版使用svn下载. 软件要求: The following are the external system and software requirements for installing and ...
- Git经常使用命令总结
Git是一款开源的分布式版本号控制系统,由Linux之父Torvalds用C语言开发. "the stupid content tracker",Git自诩为stupid,却是一个 ...
- [Codeforces 1058E] Vasya and Good Sequences
[题目链接] https://codeforces.com/contest/1058/problem/E [算法] 显然 , 我们只需考虑序列中每个数的二进制表示下1的个数即可. 不妨令Ai表示第i个 ...