如题,
就是把Session输出到文本文件。
但是Session里边放的东西不知道,
比如key="userInfo" Value=一个自定义的类的对象。要求是输出每个属性的名字和值。
我用反射做的,
理论上是可以实现的,
但是到第二层的时候,反射出来的是一个接口,
就执行不下去了。
请各位帮帮忙。在线等。
就是把Session输出到文本文件。
但是Session里边放的东西不知道,
比如key="userInfo" Value=一个自定义的类的对象。要求是输出每个属性的名字和值。
我用反射做的,
理论上是可以实现的,
但是到第二层的时候,反射出来的是一个接口,
就执行不下去了。
请各位帮帮忙。在线等。
解决方案 »
- j2ee 項目发布到linux的tomcate下 无法访问
- 请教一下各位,在jsp开发后台管理中 ,它的字处理功能是如何实现的??是怎样一个思路???
- jsp 页面连接问题 。。。
- 动态控制表单
- (有正确答案就结帐)catch抛出的异常是在Jbuilder的控制台中显示出来吗?
- 在Jive3里面有的后缀是 *.jspa 这个好像在actions.xml里面有定义....但小弟水平太菜,有哪位高手可以和小弟我讲讲这个actions.xml文件的作
- Help!!! 关于jar
- 求jpg图片压缩的高效率方法!
- spring+hibernate多数据源配置
- 急招项目经理
- jsp回车键添加一行,想了很久,没想出来
- spring的小问题
看我的代码吧。
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;/**
*
*/
public class DumpObject_0 {
static final int INDENT_WIDTH = 2;
static final String LF = System.getProperty("line.separator");
static Method TOSTRING;
static {
try {
TOSTRING = Object.class.getMethod("toString", new Class[0]);
} catch (Exception e) {
System.out.println("...");
e.printStackTrace();
}
}
Object target;
Map embeded;
/**
*
*/
public DumpObject_0(Object o) {
target = o;
} class EmbededKey {
Class cls;
Object obj;
EmbededKey(Class c, Object o) {
obj = o;
cls = c;
}
public boolean equals(Object o) {
if (o instanceof EmbededKey) {
return ((EmbededKey)o).cls == cls && ((EmbededKey)o).obj == obj;
}
return false;
}
public int hashCode() {
return cls.hashCode() ^ obj.hashCode();
}
}
/**
* @@return
*/
public String toString() {
embeded = new HashMap();
String s = toString(target, 0);
embeded = null;
return s;
}
String toString(Object o, int level) {
if (o == null) {
return "null";
} else {
return dumpValue(o.getClass(), o, level);
}
}
String dumpValue(Class c, Object o, int level) {
if (o == null) {
return "null";
} else if (c.isPrimitive() || c == Object.class) {
return o.toString();
}
StringBuffer buffer = new StringBuffer();
if (CharSequence.class.isInstance(o)) {
buffer.append('"').append(o).append('"');
} else if (c.isArray()) {
buffer.append("Array[");
for (int i = 0, n = Array.getLength(o); i < n; i++) {
buffer.append(toString(Array.get(o, i), level + 1));
buffer.append(",");
}
buffer.append(']');
//↓ ADD
} else if (o instanceof Map) {
buffer.append(dumpMap(c, o, level));
} else if (o instanceof Vector) {
buffer.append(dumpVector(c, o, level));
//↑ ADD
} else {
EmbededKey ekey = new EmbededKey(c, o);
if (embeded.containsKey(ekey)) {
buffer.append('(').append(embeded.get(ekey)).append(')');
} else {
buffer.append(dumpObject(c, o, level));
}
}
return new String(buffer);
}
String dumpObject(Class c, Object o, int level) {
assert o != null && !c.isArray() && !c.isPrimitive()
&& !CharSequence.class.isInstance(c);
try {
Method m = c.getMethod("toString", new Class[0]);
if (!TOSTRING.equals(m)) {
return o.toString();
}
} catch (NoSuchMethodException e) { // never
e.printStackTrace();
return o.toString();
}
embeded.put(new EmbededKey(c, o), o.toString());
StringBuffer buffer = new StringBuffer();
buffer.append(c.getName());
buffer.append(dumpFields(c, o, level));
c = c.getSuperclass();
if (c != null && c != Object.class) {
buffer.append("->");
buffer.append(dumpValue(c, o, level));
}
return new String(buffer);
}
String dumpFields(Class c, Object o, int level) {
StringBuffer buffer = new StringBuffer();
buffer.append("{");
Field[] f = c.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
buffer.append(f[i].getName()).append('=');
if (!f[i].isAccessible()) {
changeAccessible(f[i], true);
}
try {
buffer.append(dumpValue(f[i].getType(), f[i].get(o), level + 1));
} catch (IllegalAccessException e) {
buffer.append("EACCESS");
}
buffer.append(",");
}
buffer.append("}");
return new String(buffer);
}
void changeAccessible(Field f, boolean tobe) {
try {
f.setAccessible(tobe);
} catch (SecurityException e) {
System.out.println("changeAccessible");
e.printStackTrace();
}
}
String createIndent(int level) {
char[] c = new char[level * INDENT_WIDTH];
Arrays.fill(c, ' ');
return new String(c);
}
//↓ ADD
String dumpMap(Class c, Object o, int level){
StringBuffer buffer = new StringBuffer();
Map map = (Map)o;
Set set = map.keySet();
Iterator iterator = set.iterator();
Object object = null;
buffer.append("Map[");
while(iterator.hasNext()){
object = iterator.next();
if (object != null) {
buffer.append(object.toString()).append("=");
buffer.append(toString(map.get(object), level + 1));
buffer.append(",");
}
}
buffer.append(']');
return new String(buffer);
} String dumpVector(Class c, Object o, int level){
StringBuffer buffer = new StringBuffer();
Vector vector = (Vector)o;
Object object = null;
buffer.append("Vector[");
for (int i = 0; i < vector.size(); i++){
object=(Object)vector.get(i);
buffer.append(toString(vector.get(i), level + 1));
buffer.append(",");
}
buffer.append(']');
return new String(buffer);
}
//↑ ADD
}
//@调用的地方。
HttpSession sess = super.getHttpServletRequest().getSession();
DumpObject_0 dumpObject = new DumpObject_0(sess);
String sessString = dumpObject.toString();我要得到的就是最后这个 sessString
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import javax.servlet.http.HttpSession;public class Test {
public void sessionReflect(HttpSession session) {
Class rclass = session.getClass();
Field[] fields = rclass.getDeclaredFields();
try {
//获得方法
Method rmth = rclass.getMethod("getAttribute", String.class);
Field field;
for (int i = 0; i < fields.length; i++) {
field = fields[i];
//得到值
Object val = rmth.invoke(session, field.getName());
field.getName(); //得到属性名
field.getType(); //得到类型
} } catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
如果 target 不是 map 或者 Vector。你是打算把对象的字段输出来?对于 HttpSession,你新加一个方法 dumpSession 得了。
这个主要利用递归算法主要逻辑是
接受一个对象
然后利用反射解析它
最后形成
字段名=字段值
这样的字符串/
例如Class A {
private String s1 = "Hello1";
private String s2 = "Hello2";
private String s3 = "Hello3";
private ArrayList array = new ArrayList(); public A () {
array.add("word1");
array.add("word2");
array.add("word3");
}
}
经过我写的这个解析之后
需要形成s1 = "Hello1"
s2 = "Hello2"
s3 = "Hello3"
array = ["word1","word2","word3"]
这样的结果。
字段的值你上面已经得到了。getAttribute里面的值,可以这样 Enumeration em = session.getAttributeNames();
while (em.hasMoreElements()) {
String name = em.nextElement().toString();
Object value = session.getAttribute(name);
}