`
zoutm
  • 浏览: 95389 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

超级强悍的java对象属性查看工具

阅读更多

在做一个hadoop的editlog查看工具,由于editlog都是用dataoutputStream输出的,在载入这类文件需要完全相反的方向DatainputStream先转换成对应的类,这个非常麻烦。特别是有部分类的成员是private的,也没有提供get方法,如何方便打印这些信息。想到只有用终极武器反射来完成这样的使命,以下就是我写的可以完全遍历对象树并将对象用json格式打印处理的code。

public class ObjectViewer {
	public ObjectViewer() {
	}

	@SuppressWarnings("rawtypes")
	private void fetchAllFields(Class c, List<Field> fields) {
		assert fields != null;
		if (c == Object.class || c.isPrimitive() || c.isArray() || c == String.class) {
			return;
		} else {
			fetchAllFields(c.getSuperclass(), fields);
			for (Field field : c.getDeclaredFields()) {
				field.setAccessible(true);
				fields.add(field);
			}
		}
	}

	private StringBuilder buildPrimitiveField(Field field, Object instance,
			StringBuilder builder) throws IllegalArgumentException,
			IllegalAccessException {
		assert field.getType().isPrimitive();
		Object v = field.get(instance);
		if(v == null){
			return builder;
		}
		return builder.append(field.getName() + ":" + v);
	}

	private StringBuilder buildStringField(Field field, Object instance,
			StringBuilder builder) throws IllegalArgumentException,
			IllegalAccessException {
		assert field.getType() == String.class;
		Object v = field.get(instance);
		if(v == null){
			return builder;
		}
		return builder.append(field.getName() + ":\"" + v + "\"");
	}

	private StringBuilder buildArrayField(Field field, Object instance,
			StringBuilder builder) throws Exception{
		assert field.getType().isArray();
		Object v = field.get(instance);
		if(v == null){
			return builder;
		}
		builder.append(field.getName());
		builder.append(":[");
		boolean isFirst = true;
		for (int i = 0; i < Array.getLength(v); i++) {
			if(!isFirst){
				builder.append(',');
			}else{
				isFirst = false;
			}
			buildObject(Array.get(v, i),builder);
		}
		builder.append(']');
		return builder;
	}

	private StringBuilder buildClassField(Field field, Object instance,
			StringBuilder builder) throws Exception {
		assert !(field.getType().isPrimitive()
				|| field.getType() == String.class || field.getType().isArray());
		Object v = field.get(instance);
		if(v == null){
			return builder;
		}
		buildObject(v,builder);
		return builder;
	}
	@SuppressWarnings("rawtypes")
	public StringBuilder buildObject(Object obj, StringBuilder builder){
		try{
			Class objClazz = obj.getClass();
			if(objClazz.isPrimitive() || objClazz == String.class || obj instanceof Number){
				return builder.append("" + obj);
			}
			List<Field> allFields = new ArrayList<Field>();
			fetchAllFields(obj.getClass(), allFields);
			builder.append('{');
			boolean isFirst = true;
			for (Field field : allFields) {
				if(!isFirst){
					builder.append(',');
				}else{
					isFirst = false;
				}
				Class type = field.getType();
				if (type.isPrimitive()) {
					buildPrimitiveField(field, obj, builder);
				} else if (type == String.class) {
					buildStringField(field, obj, builder);
				} else if (type.isArray()) {
					buildArrayField(field, obj, builder);
				} else {
					buildClassField(field, obj, builder);
				}
			}
			builder.append('}');
			return builder;
		}catch (Exception e) {
			e.printStackTrace();
			return builder;
		}
		
	}

	public static void main(String[] args) throws Exception{
//		System.out.println(Integer.class.isPrimitive());
		ObjectViewer objviever = new ObjectViewer();
		System.out.println(objviever.buildObject(objviever,new StringBuilder()).toString());
//		System.out.println(objviever.buildObject(new ArrayObj()));
	}

}

 

使用方法非常简单,扔个对象进去,不管他有多复杂的结构,都会把对象的所有属性打印出来。

分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包4

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包3

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java源码包2

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...

    Java EE常用框架.xmind

    无论是热部署或者是热加载、都是基于Java类加载器来完成的。 SpringBoot实现热部署 1、在plugin标签中加入插件 Shiro 简介 shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户...

    bigconnect:多模型大数据图存储,支持图,文档,键值和对象模型

    它可以存储具有多值属性和原始数据,快速查询,聚合,分布式数据处理管道和超强安全性(行和属性级别)的对象和链接。 可用于构建涵盖大多数数据分析用例和行业要求的解决方案,从财务分析到社交媒体和网络安全。 ...

    精通javascript

    • 6.26.htm for…in语句调用对象属性 • 6.25.htm for…in语句调用属性值 第7章(\第7章) • 7.1.htm 字符串合并 • 7.2.htm 字符串合并 • 7.3.htm 字符串中使用转义...

    精通JavaScript

    • 6.26.htm for…in语句调用对象属性 • 6.25.htm for…in语句调用属性值 第7章(\第7章) • 7.1.htm 字符串合并 • 7.2.htm 字符串合并 • 7.3.htm 字符串中使用转义...

    易语言程序免安装版下载

    修改BUG:超级列表框在属性“整行选择”为真时,鼠标单击第一列右面也会导致第一列中的选择框被选中或取消选中。 21. 修改BUG:Sqlite3数据库支持库中“Sqlite数据库.取错误文本()”返回的文本是UTF-8编码(应是GB...

    Maven权威指南 很精典的学习教程,比ANT更好用

    验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装Maven 2.3.3. 在Linux上安装Maven 2.3.4. 在FreeBSD或OpenBSD上安装Maven 2.4. 验证Maven...

    RED HAT LINUX 6大全

    2.4.7 超级用户口令 15 2.5 Red Hat软件包管理程序 16 2.6 小结 16 第3章 LILO 17 3.1 安装与配置LILO 18 3.1.1 安装或重新配置LILO 18 3.1.2 配置LILO 18 3.2 使用LOADLIN.EXE引导Linux 20 3.3 如何卸载LILO 21 3.4...

    网管教程 从入门到精通软件篇.txt

    Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...

Global site tag (gtag.js) - Google Analytics