我定义了下面一个类,其中有两个属性分别是自普通对象以及一个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());
}
}
}
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());
}
}
}
应该有帮助吧...
http://www.coderanch.com/t/383648/java/java/java-reflection-element-type-List
你在这里已经通过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.
.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));
}
}
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();
}
}
}