`
zoutm
  • 浏览: 96378 次
  • 性别: 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面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java源码包3

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

    java源码:JAVA实现超级玛丽.zip

    【标题】:“JAVA实现超级玛丽”是一份基于Java编程语言的开源项目,旨在复刻经典游戏《超级玛丽》。这个项目展示了如何用Java技术来构建一个2D游戏,包括游戏逻辑、角色动画、碰撞检测以及游戏循环等核心功能。 ...

    java源码包2

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

    Java项目实战-基于Java的超级玛丽游戏的设计与实现(附源码,部署说明).zip

    在本Java项目实战中,我们将深入探讨如何设计和实现一个基于Java的超级玛丽游戏。这个项目不仅涵盖了游戏的基本逻辑和机制,还展示了Java编程的强大功能和灵活性。通过学习和研究这个项目,开发者可以提升自己的面向...

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

    密钥 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 源码DEMO 3(1-4是独立压缩包)

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

    超级玛丽源码.zip

    在这个"超级玛丽"的实现中,pygame的核心组件如Surface对象(用于绘制图像)和Rect对象(用于表示图像的位置和大小)将被广泛使用。 源码中可能会包含以下关键部分: 1. 初始化:设置窗口大小、背景色、帧率等,...

    基于Java设计实现职工信息管理系统.pdf

    在职工信息管理系统中,Java可能被用来创建登录界面、菜单、表格等元素,使用户能够方便地查看、添加、删除和修改信息。 2. **数据处理**:Java的强项在于其对数据库的集成能力,它允许开发者通过JDBC(Java ...

    Java虚拟机

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

    Java EE常用框架.xmind

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

    练习java基础的SMS项目.pdf

    此外,类还包括了一个无参构造器以及`toString()`方法,便于打印和查看对象信息。 任务二涉及到接口的封装,这是Java中实现多态性和抽象的一种方式。`AdminManagementBIZ`接口定义了管理员管理模块的业务逻辑,包括...

    Java图书管理系统资料报告材料.doc

    在开发Java图书管理系统时,通常会采用一系列的工具和技术,例如Java编程语言作为主要开发语言,因为它具备跨平台性和强大的面向对象特性。同时,可能会使用MySQL或Oracle等关系型数据库管理系统来存储和管理数据,...

    比较好用的json本地格式化工具,hiJson Windows64位版,超级好用。json解析

    下载并安装“HiJson 2.1.2_jdk64.exe”文件后,用户可以在无Java环境的情况下直接运行该工具,因为这个版本已经内置了兼容64位系统的Java运行环境。 对于Android开发人员而言,hiJson也是一个有价值的辅助工具。...

    MySQL超级详细笔记

    表中的一行数据可以类比为Java中的对象,每列中的值是对象的属性值。 MySQL数据库可以安装在Windows操作系统上。从MySQL官网可以下载到不同版本的MySQL软件。例如,MySQL 5.7.25的版本可以在这里找到下载链接:***...

    Business Intelligence 平台用户指南

    6. 程序对象管理:解释了什么是程序对象和实例,并介绍了如何设置程序处理选项、配置可执行的程序对象、配置Java程序,以及如何为程序对象指定用户帐户。 7. 对象包管理:介绍了对象包的概念,如何创建新的对象包,...

    java-xueshengguanli.rar_Java编程_Java_

    3. 管理员权限:设定不同级别的管理员,如普通管理员只能查看和修改学生信息,超级管理员则可以进行系统设置。 四、安全与性能优化 1. 权限控制:使用角色-权限模型进行权限分配,确保数据的安全性。 2. SQL优化:...

Global site tag (gtag.js) - Google Analytics