引用:http://www.blogjava.net/jxlazzw/articles/389452.htmlhtml
現有每多個javabean,可是每一個bean中都有不一樣的屬性,而且都是經過get和set方法來修改和獲取值。若是調試一步一步去猜內部結構,想用一個方法能夠獲取不一樣對像中各個屬性的值,怎麼辦呢?能夠利用JAVA的反射機制。java
1.此爲小引.net
//運用反射機制遍歷單個對像中每一個屬性值
public static void Reflect_Object(Object o,String classPath){
try {
Class userClass = Class.forName(classPath);//加載類
Method[] methods = userClass.getDeclaredMethods();//得到類的方法集合
//遍歷方法集合
for(int i =0 ;i<methods.length;i++){
//獲取全部getXX()的返回值
//methods[i].getName()方法返回方法名
if(methods[i].getName().startsWith("get")){
Object object = methods[i].invoke(o, null);
System.out.println(" "+methods[i].getName()+"="+object);
}
}
System.out.println("====");
} catch (Exception e) {
e.printStackTrace();
}
}調試
2.若遍歷的bean有父類,則方法1則取不到父類中各個屬性的值,故本類爲擴充,不只能夠取到bean中每一個屬性的值,連父類的屬性值也能夠一併得到。htm
@SuppressWarnings("unchecked")
public static void Reflect_Object(Object o,String classPath){
try {
Class _class = Class.forName(classPath);// 加載類
// Method[] methods = _class.getDeclaredMethods();// 得到類的方法集合
recursive(o,_class);
// 遍歷方法集合
// for (int i = 0; i < methods.length; i++) {
// // 獲取全部getXX()的返回值
// if (methods[i].getName().startsWith("get")) {// 方法返回方法名
// methods[i].setAccessible(true);//容許private被訪問(以免private getXX())
// Object object = methods[i].invoke(o, null);
// System.out.println(" " + methods[i].getName() + "=" + object);
// }
// }
// 遍歷父類方法集合
// if (_class.getGenericSuperclass() != null) {
// Class superClass = _class.getSuperclass();// 父類
// Method[] superMethods = superClass.getDeclaredMethods();//父類方法
// for (int j = 0; j < superMethods.length; j++) {
// // 獲取全部getXX()的返回值 Method method :
// if (superMethods[j].getName().startsWith("get")) {// 方法返回方法名
// methods[j].setAccessible(true);//容許private被訪問
// Object object = superMethods[j].invoke(o, null);
// System.out.println(" " + superMethods[j].getName()+ "=" + object);
// }
// }
// Field[] fields = superClass.getDeclaredFields();//父類變量
// for(Field field : fields) {
// System.out.println(field);
// }
// }
System.out.println("====");
} catch (Exception e) {
e.printStackTrace();
}
}blog
//遞歸遍歷類及父類的屬性值
@SuppressWarnings("unchecked")
public static Class recursive(Object o,Class _class){
if(_class==null)
return null;
else{
Method[] methods = _class.getDeclaredMethods();// 得到類的方法集合
// 遍歷方法集合
for (int i = 0; i < methods.length; i++) {
// 獲取全部getXX()的返回值
if (methods[i].getName().startsWith("get")) {// 方法返回方法名
methods[i].setAccessible(true);//容許private被訪問(以免private getXX())
Object object;
try {
object = methods[i].invoke(o, null);
System.out.println(" " + methods[i].getName() + "=" + object);
} 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();
}
}
}
System.out.println("===="+_class.getName());
return recursive(o,_class.getSuperclass());
}
}遞歸