如题,
就是把Session输出到文本文件。
但是Session里边放的东西不知道,
比如key="userInfo" Value=一个自定义的类的对象。要求是输出每个属性的名字和值。
我用反射做的,
理论上是可以实现的,
但是到第二层的时候,反射出来的是一个接口,
就执行不下去了。
请各位帮帮忙。在线等。

解决方案 »

  1.   

    Value 是对象,没法输出到文本文件。最多只能是 toString()
      

  2.   

    ToString 也行
    看我的代码吧。
    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
      

  3.   


    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();

    }

    }
      

  4.   

    业务逻辑太复杂了,又没有注释,看得头都大了,你最好简单说明一下。
    如果 target 不是 map 或者 Vector。你是打算把对象的字段输出来?对于 HttpSession,你新加一个方法 dumpSession 得了。
      

  5.   


    这个主要利用递归算法主要逻辑是
    接受一个对象
    然后利用反射解析它
    最后形成
    字段名=字段值
    这样的字符串/
    例如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"]
     
    这样的结果。
      

  6.   

    Session,你是希望得到字段的值还是,getAttribute 里面的值?
    字段的值你上面已经得到了。getAttribute里面的值,可以这样        Enumeration em = session.getAttributeNames();
            while (em.hasMoreElements()) {
                String name = em.nextElement().toString();
                Object value = session.getAttribute(name);
            }
      

  7.   

    谢谢各位了我不该死抠着反射的session这玩意儿太特殊了:)揭帖了。