java获取类中的属性和值

来源:互联网 发布:实时跟踪软件 编辑:程序博客网 时间:2024/06/05 09:46

java中反射是一种非常神奇的机制,通过反射,我可以知道我的某个类含有那些属性,那些方法,继承自那个类,又有什么样的构造方法。如果我们要大量获取类中的内容,但事先我并不知道这个类中有什么样的属性,有什么样的方法,我们该怎么办。按照一般的逻辑,是没办法实现的,因为未知的东西我没办法去已知其属性。这样就通过反射来实现了。

建立一个实体类:Dog

public class Dog {private String name;private String sex;private int age;public Dog() {}public Dog(String name, String sex, int age) {super();this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

然后是一个测试类,Test:

import java.lang.reflect.Field;import java.lang.reflect.Method;public class Test {public static void main(String[] args) {Dog dog = new Dog("小黑", "雄", 2);show(Dog.class, dog);}public static void show(Class<?> clazz, Object obj) {Field[] fileds = clazz.getDeclaredFields();for (Field f : fileds) {System.out.println("----属性:"+getFiled(f)+"--------值:"+getFieldValue(obj, getFiled(f)));}}public static String getFiled(Field f) {String str = f.toString().substring(f.toString().lastIndexOf('.') + 1,f.toString().length());return str.substring(0, 1).toUpperCase() + str.replaceFirst("\\w", "");} /**  * 获取对象的属性和属性值  *   * @author ghj  * @param jointPoint  * @return  * @throws Throwable  */ public  static  String getFieldValue(Object owner, String fieldName) {  if(invokeMethod(owner, fieldName, null)!=null){   return invokeMethod(owner, fieldName, null).toString();  }else{   return "null";  } } /**  *   * 执行某个Field的getField方法  *   * @param owner  *            类  * @param fieldName  *            类的属性名称  * @param args  *            参数,默认为null  * @return  */ private static Object invokeMethod(Object owner, String fieldName, Object[] args) {  Class<? extends Object> ownerClass = owner.getClass();  // fieldName -> FieldName  String methodName = fieldName.substring(0, 1).toUpperCase()    + fieldName.substring(1);  Method method = null;  try {   method = ownerClass.getMethod("get" + methodName);  } catch (SecurityException e) {   // e.printStackTrace();  } catch (NoSuchMethodException e) {   // e.printStackTrace();   return "";  }  // invoke getMethod  try {   return method.invoke(owner);  } catch (Exception e) {   return "";  } }}

然后得到测试的结果

 

----属性:Name--------值:小黑----属性:Sex--------值:雄----属性:Age--------值:2


神奇的java