我定义了下面一个类,其中有两个属性分别是自普通对象以及一个LIST<>类型。类定义如下:
package com.wxjlib.util;import java.util.ArrayList;
import java.util.List;public class FlashChar { private String palette;
private String canvasBgAlpha;
private String caption;
private String shownames;
private String numberPrefix;
private String SNumberSuffix;
private String NumberSuffix;
private String PYAxisValuesDecimals;
private String connectNullData;
private String decimals;
private String showBorder;
private String borderColor;
private String pmaxColWidth;
private String PYAxisName;
private String SYAxisName;
private String pnumDivLines;
private String formatNumberScale;
private String baseFontSize;
private String rotateLabels;
private String slantLabels;
private Category categories;
private List<DataSet> dataset = new ArrayList<DataSet>(); class Category {
private List<String> lables = new ArrayList<String>(); public List<String> getLables() {
return lables;
} public void setLables(List<String> lables) {
this.lables = lables;
} public void addLables(String str) {
this.lables.add(str);
} public void removeLables(int index) {
this.lables.remove(index);
} public void removeLables(String o) {
this.lables.remove(o);
} } class DataSet {
private String seriesName;
private String showValues;
private List<String> values = new ArrayList<String>(); public String getSeriesName() {
return seriesName;
} public void setSeriesName(String seriesName) {
this.seriesName = seriesName;
} public String getShowValues() {
return showValues;
} public void setShowValues(String showValues) {
this.showValues = showValues;
} public List<String> getValues() {
return values;
} public void setValues(List<String> values) {
this.values = values;
} public void addValues(String str) {
this.values.add(str);
} public void removeValues(int index) {
this.values.remove(index);
} public void removeValues(String o) {
this.values.remove(o);
}
} public String getPalette() {
return palette;
} public void setPalette(String palette) {
this.palette = palette;
} public String getCanvasBgAlpha() {
return canvasBgAlpha;
} public void setCanvasBgAlpha(String canvasBgAlpha) {
this.canvasBgAlpha = canvasBgAlpha;
} public String getCaption() {
return caption;
} public void setCaption(String caption) {
this.caption = caption;
} public String getShownames() {
return shownames;
} public void setShownames(String shownames) {
this.shownames = shownames;
} public String getNumberPrefix() {
return numberPrefix;
} public void setNumberPrefix(String numberPrefix) {
this.numberPrefix = numberPrefix;
} public String getSNumberSuffix() {
return SNumberSuffix;
} public void setSNumberSuffix(String sNumberSuffix) {
SNumberSuffix = sNumberSuffix;
} public String getNumberSuffix() {
return NumberSuffix;
} public void setNumberSuffix(String numberSuffix) {
NumberSuffix = numberSuffix;
} public String getPYAxisValuesDecimals() {
return PYAxisValuesDecimals;
} public void setPYAxisValuesDecimals(String pYAxisValuesDecimals) {
PYAxisValuesDecimals = pYAxisValuesDecimals;
} public String getConnectNullData() {
return connectNullData;
} public void setConnectNullData(String connectNullData) {
this.connectNullData = connectNullData;
} public String getDecimals() {
return decimals;
} public void setDecimals(String decimals) {
this.decimals = decimals;
} public String getShowBorder() {
return showBorder;
} public void setShowBorder(String showBorder) {
this.showBorder = showBorder;
} public String getBorderColor() {
return borderColor;
} public void setBorderColor(String borderColor) {
this.borderColor = borderColor;
} public String getPmaxColWidth() {
return pmaxColWidth;
} public void setPmaxColWidth(String pmaxColWidth) {
this.pmaxColWidth = pmaxColWidth;
} public String getPYAxisName() {
return PYAxisName;
} public void setPYAxisName(String pYAxisName) {
PYAxisName = pYAxisName;
} public String getSYAxisName() {
return SYAxisName;
} public void setSYAxisName(String sYAxisName) {
SYAxisName = sYAxisName;
} public String getPnumDivLines() {
return pnumDivLines;
} public void setPnumDivLines(String pnumDivLines) {
this.pnumDivLines = pnumDivLines;
} public String getFormatNumberScale() {
return formatNumberScale;
} public void setFormatNumberScale(String formatNumberScale) {
this.formatNumberScale = formatNumberScale;
} public String getBaseFontSize() {
return baseFontSize;
} public void setBaseFontSize(String baseFontSize) {
this.baseFontSize = baseFontSize;
} public String getRotateLabels() {
return rotateLabels;
} public void setRotateLabels(String rotateLabels) {
this.rotateLabels = rotateLabels;
} public String getSlantLabels() {
return slantLabels;
} public void setSlantLabels(String slantLabels) {
this.slantLabels = slantLabels;
} public Category getCategories() {
return categories;
} public void setCategories(Category categories) {
this.categories = categories;
} public List<DataSet> getDataset() {
return dataset;
} public void setDataset(List<DataSet> dataset) {
this.dataset = dataset;
}
public void addDataset(DataSet str) {
this.dataset.add(str);
} public void removeDataset(int index) {
this.dataset.remove(index);
} public void removeDataset(DataSet o) {
this.dataset.remove(o);
}
}想请教的问题是,我现在取得上面的类的对象后,如何通过反射取得其中List中每个对象的属性名称,以及对应的值。我现在写的代码如下,但是不知道如何通过反射取List中每个对象的相关值。
Class clazz = o.getClass();
// System.out.println("22"+o.getClass().getDeclaredField("this$0").get(o));
Field[] fields = clazz.getDeclaredFields();
if (fields.length < 1)
return "";
for (short j = 0; j < fields.length; j++) {
Field field = fields[j];
if (!field.isAccessible()) {
field.setAccessible(true);
}
Object value = field.get(o);
System.out.println("value:" + value);
System.out.println("name:" + field.getName());
System.out.println("type:" + field.getType());
chart.append(field.getName() + "='" + (value == null ? "" : value) + "' ");
System.out.println("getDeclaringClass:" + field.getDeclaringClass());
if (List.class.isAssignableFrom(field.getType())) {
Type t = field.getGenericType();
if (t instanceof ParameterizedType) {
Type[] arg = ((ParameterizedType) t).getActualTypeArguments();
System.out.println("arg:" + arg[0]);
Class z = (Class) arg[0];
System.out.println("z:" + z.getDeclaringClass());
Field[] tt = z.getDeclaredFields();
for (short k = 0; k < tt.length; k++) {
Field m = tt[k];
if (!m.isAccessible()) {
m.setAccessible(true);
}
System.out.println("z value =:" + m.getName());
}
}
}

解决方案 »

  1.   

    参考:http://wishlife.iteye.com/blog/209885
    应该有帮助吧...
      

  2.   

    刚刚看了这个贴子,但是不行
    http://www.coderanch.com/t/383648/java/java/java-reflection-element-type-List
      

  3.   

    1. java程序在运行时都是没有类型的吧,他都只是通过CLASS把相关的内容记下来然后在程序运行回来时把它转成相应的对象的。
    你在这里已经通过Type[] arg = ((ParameterizedType) t)
    .getActualTypeArguments();
    System.out.println("arg:" + arg[0]);得到如下的内容class Test.FlashChar$DataSet我想你就只有通过split把DataSet取出来了。然后通过他的getClass来反射到他内部的属性值。当然前提是你得先把它从那个LIST里面取出来.
    2.还有你这里代码里面好像不对if (fields.length > 1)应该是大于1,不是小于1.
      

  4.   

    相应部分改写下应该可以了,楼主试下吧 Type[] arg = ((ParameterizedType) t)
    .getActualTypeArguments();
    System.out.println("arg:" + arg[0]);
    Class z = (Class) arg[0];
    System.out.println("z:" + z.getDeclaringClass());
    Field[] tt = z.getDeclaredFields();
    for (Object item : (List) field.get(o)) {
    int temp=0;
    temp++;
    for (short k = 0; k < tt.length; k++) {
    Field m = tt[k];
    if (!m.isAccessible() && temp == 1) {
    m.setAccessible(true);
    }
    System.out.println("z name =:" + m.getName()+" z value =:"+m.get(item));
    }
    }
      

  5.   

    要完全解析一个实例,还是比较复杂的,按LZ的意图大概写了sample,LZ可以参考import java.util.*;
    import java.lang.reflect.*;public class Analyzer {
    /*
        static Set<Class<?>> simpleTypeSet = new HashSet<Class<?>>();
        static {
            simpleTypeSet.add(int.class);
            simpleTypeSet.add(char.class);
            simpleTypeSet.add(byte.class);
            simpleTypeSet.add(short.class);
            simpleTypeSet.add(int.class);
            simpleTypeSet.add(long.class);
            simpleTypeSet.add(float.class);
            simpleTypeSet.add(double.class);
            simpleTypeSet.add(java.lang.Boolean.class);
            simpleTypeSet.add(java.lang.Character.class);
            simpleTypeSet.add(java.lang.Byte.class);
            simpleTypeSet.add(java.lang.Short.class);
            simpleTypeSet.add(java.lang.Integer.class);
            simpleTypeSet.add(java.lang.Long.class);
            simpleTypeSet.add(java.lang.Float.class);
            simpleTypeSet.add(java.lang.Double.class);
            simpleTypeSet.add(java.lang.String.class);
        }
    */
        public static void main(String[] args) {
            try {
                FlashChar o = new FlashChar();
                FlashChar.Category g = o.new Category();
                g.addLables("abc");
                o.setCategories(g);
                FlashChar.DataSet ds = o.new DataSet();
                ds.addValues("bcd");
                List<FlashChar.DataSet> lds = new ArrayList<FlashChar.DataSet>();
                lds.add(ds);
                o.setDataset(lds);
                StringBuilder buf = new StringBuilder();
                analyze(o, Analyzer.class, "o", buf);
                System.out.println(buf.toString());        } catch (Throwable e) {
                e.printStackTrace();
            }
        }    @SuppressWarnings("unchecked")
        public static void analyze(Object obj, Class declare, String name, StringBuilder buf) {
            try {
                if (obj == null) {
                    System.out.println("declare:" + declare);
                    System.out.println("name:" + name);
                    System.out.println("type: unknow");
                    System.out.println("value: null");
                    System.out.println("------------------------------");
                    buf.append(declare + ":" + name + "=null ");
                    return;
                }
                
                Class clazz = obj.getClass();
                Method method = null;
                try {
                    method = clazz.getDeclaredMethod("toString");
                } catch (Exception e) {
                    //
                }
                
                if (Collection.class.isAssignableFrom(clazz)) { //集合类
                    Type[] arg = clazz.getTypeParameters();
                    System.out.println("declare:" + declare);
                    System.out.println("name:" + name);
                    System.out.println("type:" + obj.getClass() + ((arg.length > 0 ? ("<"+arg[0]+">") : "")));
                    System.out.println("value: Collection");
                    System.out.println("------------------------------");
                    buf.append(declare + ":" + name + "=Collection ");
                    Iterator it = ((Collection)obj).iterator();
                    while (it.hasNext()) {
                        analyze(it.next(), declare, name+"->elment", buf);
                    }
                    
                } else if (clazz.isArray()) { //数组类
                     System.out.println("declare:" + declare);
                     System.out.println("name:" + name);
                     System.out.println("type:" + clazz);
                     System.out.println("value: Array");
                     buf.append(declare + ":" + name + "=Array ");
                     System.out.println("------------------------------");
                     for (Object o : (Object[])obj) {
                         analyze(o, declare, name, buf);
                     }
                        
                } else if (method == null) { //没有重写toString的类
                    System.out.println("declare:" + declare);
                    System.out.println("name:" + name);
                    System.out.println("type:" + clazz);
                        
                    Field[] fields = clazz.getDeclaredFields();
                    if (fields.length < 1) {
                        System.out.println("value:" + obj);
                        System.out.println("------------------------------");
                        buf.append(declare + ":" + name + "='" + obj + "' ");
                        return;
                    } else {
                        System.out.println("value: User Class");
                        System.out.println("------------------------------");
                        buf.append(declare + ":" + name + "='User Class' ");
                    }
                    
                    for (Field field : fields) {
                        if ("this$0".equals(field.getName())) {
                            continue;
                        }
                        if (!field.isAccessible()) {
                            field.setAccessible(true);
                        }
                    
                        Class clazz2 = field.getType();
                        Object value = field.get(obj);
                        Method method2 = null;
                        try {
                            method2 = clazz2.getDeclaredMethod("toString");
                        } catch (Exception e) {
                            //
                        }
                        if (value == null) {
                            System.out.println("declare:" + field.getDeclaringClass());
                            System.out.println("name:" + field.getName());
                            System.out.println("type:" + clazz2);
                            System.out.println("value:" + value);
                            System.out.println("------------------------------");
                            buf.append(field.getDeclaringClass() + ":" + field.getName() + "=null ");
                            
                        } else if (Collection.class.isAssignableFrom(clazz2)) { //集合类
                            analyze(value, field.getDeclaringClass(), field.getName(), buf); //递归解析
                            
                        } else if (clazz2.isArray()) { //数组类
                            analyze(value, field.getDeclaringClass(), field.getName(), buf); //递归解析
                            
                        } else if (method2 == null) { //没有重写toString的类
                             analyze(value, clazz2, field.getName(), buf); //递归解析
                            
                        } else {
                            System.out.println("declare:" + field.getDeclaringClass());
                            System.out.println("name:" + field.getName());
                            System.out.println("type:" + field.getType());
                            System.out.println("value:" + value);
                            System.out.println("------------------------------");
                            buf.append(field.getDeclaringClass() + ":" + field.getName() + "='" + value + "' ");
                        }
                    }
                    
                } else {
                    System.out.println("declare:" + declare);
                    System.out.println("name:" + name);
                    System.out.println("type:" + clazz);
                    System.out.println("value:" + obj);
                    System.out.println("------------------------------");
                    buf.append(declare + ":" + name + "='" + obj + "' ");
                }
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }