在做一个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如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
【标题】:“JAVA实现超级玛丽”是一份基于Java编程语言的开源项目,旨在复刻经典游戏《超级玛丽》。这个项目展示了如何用Java技术来构建一个2D游戏,包括游戏逻辑、角色动画、碰撞检测以及游戏循环等核心功能。 ...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
在本Java项目实战中,我们将深入探讨如何设计和实现一个基于Java的超级玛丽游戏。这个项目不仅涵盖了游戏的基本逻辑和机制,还展示了Java编程的强大功能和灵活性。通过学习和研究这个项目,开发者可以提升自己的面向...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存...
在这个"超级玛丽"的实现中,pygame的核心组件如Surface对象(用于绘制图像)和Rect对象(用于表示图像的位置和大小)将被广泛使用。 源码中可能会包含以下关键部分: 1. 初始化:设置窗口大小、背景色、帧率等,...
在职工信息管理系统中,Java可能被用来创建登录界面、菜单、表格等元素,使用户能够方便地查看、添加、删除和修改信息。 2. **数据处理**:Java的强项在于其对数据库的集成能力,它允许开发者通过JDBC(Java ...
这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...
无论是热部署或者是热加载、都是基于Java类加载器来完成的。 SpringBoot实现热部署 1、在plugin标签中加入插件 Shiro 简介 shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户...
此外,类还包括了一个无参构造器以及`toString()`方法,便于打印和查看对象信息。 任务二涉及到接口的封装,这是Java中实现多态性和抽象的一种方式。`AdminManagementBIZ`接口定义了管理员管理模块的业务逻辑,包括...
在开发Java图书管理系统时,通常会采用一系列的工具和技术,例如Java编程语言作为主要开发语言,因为它具备跨平台性和强大的面向对象特性。同时,可能会使用MySQL或Oracle等关系型数据库管理系统来存储和管理数据,...
下载并安装“HiJson 2.1.2_jdk64.exe”文件后,用户可以在无Java环境的情况下直接运行该工具,因为这个版本已经内置了兼容64位系统的Java运行环境。 对于Android开发人员而言,hiJson也是一个有价值的辅助工具。...
表中的一行数据可以类比为Java中的对象,每列中的值是对象的属性值。 MySQL数据库可以安装在Windows操作系统上。从MySQL官网可以下载到不同版本的MySQL软件。例如,MySQL 5.7.25的版本可以在这里找到下载链接:***...
6. 程序对象管理:解释了什么是程序对象和实例,并介绍了如何设置程序处理选项、配置可执行的程序对象、配置Java程序,以及如何为程序对象指定用户帐户。 7. 对象包管理:介绍了对象包的概念,如何创建新的对象包,...
3. 管理员权限:设定不同级别的管理员,如普通管理员只能查看和修改学生信息,超级管理员则可以进行系统设置。 四、安全与性能优化 1. 权限控制:使用角色-权限模型进行权限分配,确保数据的安全性。 2. SQL优化:...