问题描述:
分布式集群,同步session问题,引发查看session中序列化对象结构查看问题
初步解决方案:code说明,如有可改进部分
请给予帮助,谢谢
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpSession;
/**
* Detect the complex object structure
* Note: this is just a test, it should enhance in the future or you give assistance
* @version beta
* @author ScottXu
*
*/
public class SessionUtilWriteLogInFile {
//recursive max level, ensure not out of memory
private static int LEVEL = 30;
private static SessionUtilWriteLogInFile util = new SessionUtilWriteLogInFile();
public static SessionUtilWriteLogInFile getInstance(){
return util;
}
/**
* detect the session attribute structure
* @param session destination session
* @param logFilePath log file path like c:/
* @throws IOException
*/
@SuppressWarnings("unchecked")
public void literaSession(HttpSession session, String logFilePath) throws IOException{
File file = new File(logFilePath+session.getId()+"_"+System.currentTimeMillis()+".txt");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
Enumeration<String> sessionKeys=session.getAttributeNames();
fos.write("==========Begin session simple structure============================================\r\n".getBytes());
while(sessionKeys.hasMoreElements()){
String nextElement = sessionKeys.nextElement();
recusiveObj(session.getAttribute(nextElement), 0, fos);
}
fos.write("==========End session simple structure==============================================\r\n".getBytes());
fos.close();
}
/**
* detect the complex object structure
* @param obj destination complex object
* @param count format the style
* @param pFileOutputStream
* @throws IOException
*/
@SuppressWarnings("unchecked")
protected void recusiveObj(Object obj, int count, FileOutputStream pFileOutputStream) throws IOException{
if(count>LEVEL){
pFileOutputStream.write("too long, not recusive to the end[force return]\r\n".getBytes());
return;
}
String blank = "";
for(int i=0; i<count; i++){
blank+="\t";
}
if(isAPrimitiveType(obj.getClass())){
pFileOutputStream.write((blank+obj.toString()+"\r\n").getBytes());
return;
}
if(isSerializable(obj.getClass())){
pFileOutputStream.write((blank +obj.getClass().getName()+" is a Serializable class\r\n").getBytes());
}
if(obj instanceof Collection){
Iterator<?> iterator = ((Collection<?>)obj).iterator();
pFileOutputStream.write((blank+"{\r\n").getBytes());
while(iterator.hasNext()){
Object next = iterator.next();
recusiveObj(next, count+1, pFileOutputStream);
}
pFileOutputStream.write((blank+"}\r\n").getBytes());
return;
}
if(obj instanceof Map){
Iterator<?> iter = ((Map<?,?>)obj).entrySet().iterator();
pFileOutputStream.write((blank+"{\r\n").getBytes());
while (iter.hasNext()) {
Map.Entry<?, ?> entry = (Map.Entry<?, ?>) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
pFileOutputStream.write((blank+" "+"[key ("+key+"): value (\r\n").getBytes());
recusiveObj(val, count+1, pFileOutputStream);
pFileOutputStream.write((blank+" )]\r\n").getBytes());
}
pFileOutputStream.write((blank+"}\r\n").getBytes());
return;
}
if(obj instanceof Dictionary){
Dictionary d = (Dictionary)obj;
Enumeration<?> elements = d.elements();
pFileOutputStream.write((blank+"{\r\n").getBytes());
while(elements.hasMoreElements()){
recusiveObj(elements.nextElement(), count+1, pFileOutputStream);
}
pFileOutputStream.write((blank+"}\r\n").getBytes());
return;
}
pFileOutputStream.write((blank+obj.getClass().getName()+"\r\n").getBytes());
Field[] fields = obj.getClass().getDeclaredFields();
try {
for(Field f : fields){
f.setAccessible(true);
recusiveObj(f.get(obj), count+1, pFileOutputStream);
}
} catch (Exception e){
e.printStackTrace();
}
}
/**
* adjust the clazz is primitive type, if primitive type, we should end the recursive and do what we want to do, may be print or log
* @param clazz
* @return
*/
private boolean isAPrimitiveType(Class<?> clazz)
{
if (clazz == Boolean.TYPE) {
return true;
}
if (clazz == Character.TYPE) {
return true;
}
if (clazz == Byte.TYPE) {
return true;
}
if (clazz == Short.TYPE) {
return true;
}
if (clazz == Integer.TYPE) {
return true;
}
if (clazz == Long.TYPE) {
return true;
}
if (clazz == Float.TYPE) {
return true;
}
if (clazz == Double.TYPE) {
return true;
}
if(clazz == String.class){
return true;
}
return clazz == Void.TYPE;
}
/**
* adjust if the object is implements the Serializable interface for network
* @param clazz
* @return
*/
private boolean isSerializable(Class<?> clazz){
Class<?>[] interfaces = clazz.getInterfaces();
for(Class<?> c : interfaces){
if(c.getClass().isInstance(Serializable.class)){
return true;
}
}
return false;
}
private SessionUtilWriteLogInFile(){}
public static void main(String[] args) throws IOException {
//for instance :< the core method recusiveObj(), you could make the complex object to test>
/*Map m = new java.util.HashMap();
ComplexObject cop = new ComplexObject();
AnotherComplextOjbect a1 = new AnotherComplextOjbect("a1", "a2", "a3");
AnotherComplextOjbect b1 = new AnotherComplextOjbect("b1", "b2", "b3");
AnotherComplextOjbect c1 = new AnotherComplextOjbect("c1", "c2", "c3");
cop.setAnother(a1);
m.put("1", cop);
m.put("2", "abc");
File file = new File("c:/aaa111_"+System.currentTimeMillis()+".txt");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write("==========Begin session simple structure============================================\r\n".getBytes());
SessionUtilWriteLogInFile.getInstance().recusiveObj(m, 0, fos);
fos.write("==========End session simple structure==============================================\r\n".getBytes());
fos.close();*/
}
}
分享到:
相关推荐
通过学习和理解这些代码,你可以深入理解如何使用Java递归处理无限层级的树结构,这对于开发涉及树形数据的系统非常有用。 总之,使用Java递归实现无限层级树的关键在于定义好树节点类,明确生成新节点的条件,以及...
Java作为一种多用途的面向对象语言,提供了良好的支持来实现递归。在这个"java数据结构递归算法"主题中,我们将深入探讨递归的基本概念、如何在Java中使用递归,以及一个著名的递归应用案例——八皇后问题。 递归是...
本文将详细解析标题为“Java递归获取匹配后缀的文件列表”的程序,它演示了如何使用Java来递归地查找指定路径下具有特定后缀的文件,并将它们的路径或名称存储在列表中。 首先,让我们了解递归的基本概念。递归是指...
在Java编程语言中,递归是一种强大的工具,用于解决那些可以分解为更小、相似子问题的任务。在本文中,我们将深入探讨如何使用递归方法在Java中删除文件,这通常涉及到目录及其包含的所有文件和子目录的删除。以下是...
Java对象的内存结构分为以下几个部分: 1. 对象头:包括标记字段(用于垃圾收集、锁等)和类型指针(指向类元数据)。 2. 实例变量:存储对象的实际数据,每个变量的大小根据其类型确定。 3. 填充:为了内存对齐,...
这个"JAVA递归DEMO"可能是一个示例,演示了如何使用递归来遍历XML文档的所有元素。XML(可扩展标记语言)是用于存储和传输数据的标准化格式,而递归遍历则能有效地处理其层次结构。 首先,让我们了解递归的基本概念...
在给定的标题“关于java递归文件,以及检索特定文件”中,我们可以推测这篇博文可能探讨了如何使用Java递归算法遍历文件系统,寻找特定类型的文件。下面将详细解释这个主题。 首先,让我们理解递归的概念。递归是一...
本篇文章将深入探讨如何使用Java递归地读取XML文件。 首先,我们需要了解XML的基本结构。XML(eXtensible Markup Language)是一种标记语言,它的层次结构由元素(Element)、属性(Attribute)以及文本内容(Text ...
在Java编程中,递归是一种强大的技术,常用于解决复杂问题,例如数据结构的遍历、树形结构的绘制等。本示例中,我们利用Java递归来简单地画出一棵树,这是一个典型的图形用户界面(GUI)应用,通过NetBeans IDE实现...
总结来说,递归是编程中的重要概念,尤其在Java这样的面向对象语言中,它可以优雅地解决复杂问题。通过理解和应用递归,我们可以更好地掌握编程的艺术,而汉诺塔问题的递归解法则是学习这一技巧的一个良好起点。
在计算机科学领域,递归算法是一种非常强大的工具,它可以简化很多复杂问题的解决过程。递归算法的基本思想是将一个大问题分解成若干个与原问题相似的小问题来解决。在Java编程语言中,递归同样被广泛应用,尤其是在...
2. **递归比较**:对于嵌套的对象或包含复杂数据结构的对象,工具需要能够递归地比较每个字段,包括子对象和数组等。 3. **自定义比较逻辑**:有些字段可能需要特定的比较规则,例如日期的比较可能需要考虑时区,...
本篇将深入探讨如何实现一个非递归的、支持多个顶级节点的通用工具类来完成这一任务。 首先,我们需要理解“list转树状结构”的概念。在这个问题中,我们通常有一个扁平化的数据列表,其中每个元素代表一个节点,...
### Java对象转JSON工具类详解 #### 一、引言 在现代软件开发过程中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式被广泛使用。它基于JavaScript的一个子集,采用完全独立于编程语言的文本...
总的来说,"java对象转对象插件"是一个实用的工具,它简化了Java开发中的对象转换任务,提高了开发效率。通过使用这个插件,开发者可以更轻松地处理数据结构间的转换,使得数据处理更加高效和便捷。如果你在实际开发...
这种方法需要编写较多的代码,但如果对象结构复杂,这种方法可能更可控。 4. **使用工具类或库**:例如,Apache Commons Lang库提供了`BeanUtils.copyProperties()`方法,可以方便地将一个对象的所有属性复制到另一...
这个过程需要使用JSON的java工具包API,将层次结构的JSON对象数组通过递归的方式转换为Java对象数组,然后保存到数据库中。 首先,需要定义一个JsonItem实体类,用于存储JSON数据中的省市县信息。该实体类中包含三...