设计目的:

平时我们调试代码可以使用IDE内置的Debug工具,但有的时候我们可能没有办法利用这些专业的Debug工具进行调试(比如我们自己设计一套监控系统)。于是,我设计了一个可以打印类变量中属性值的Java类,主要利用了Java的反射机制,方便直接调用查看POJO传值是否正确等。更多用途期待大家发现,欢迎交流~

源代码参考:

打印类PrintClass:

package net.im47.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * User: siqi
 * Date: 11-10-31
 * Time: 下午10:10
 * 该类用于打印类中的所有属性及其类型、值。
 */
public class PrintClass {
    public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    public static void print(Object object) {
        StringBuffer str = new StringBuffer();
        str.append("Attribute of instance: " + object.toString() + "\n");
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.getName().equals("serialVersionUID") || field.getName().equals("$VALUES")) return;
            String name = getAttrName(field);
            String type = getAttrType(field);
            String value = getAttrValue(object, field, name);

            str.append("Name:" + name);
            str.append("\t\tType:" + type);
            str.append("\t\tValue:" + value);
            str.append("\n");
        }
        System.out.println(str);
    }

    private static String getAttrName(Field field) {
        return field.getName();
    }

    private static String getAttrType(Field field) {
        return field.getGenericType().toString();
    }

    private static String getAttrValue(Object object, Field field, String attrName) {
        try {
            Method method = object.getClass().getMethod("get" + attrName.substring(0, 1).toUpperCase() + attrName.substring(1));
            Class type = method.getReturnType();
            Object value = method.invoke(object);
            if ("java.util.Date".equals(type.toString())) {
                //dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);
                //dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
                dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
                return dateFormat.format(value);
            } else {
                print(value);
                return value.toString();
            }
        } catch (NoSuchMethodException e) {
            //System.out.println("Error: NoSuchMethod: get" + attrName.substring(0, 1).toUpperCase() + attrName.substring(1));
        } catch (InvocationTargetException e) {
            System.out.println("Error: NoInvocationTarget");
        } catch (IllegalAccessException e) {
            System.out.println("Error: IllegalAccess");
        }
        return "";
    }

    public static void main(String[] args) throws ParseException {
        Date birthday = dateFormat.parse("1987-08-08");
        User user = new User("baitao.jibt", "badsiu129hqw98ed", User.Gender.MALE, 24, birthday, new User.Address("china", "shandong", "jinan"));
        PrintClass.print(user);
    }
}

待检查类User:

package net.im47.utils;

import java.util.Date;

/**
 * User: siqi
 * Date: 11-10-30
 * Time: 下午7:22
 */
public class User {
    private String username;
    private String password;
    private Gender gender;
    private int age;
    private Date birthday;
    private Address address;

    public enum Gender {MALE, FEMALE}

    ;

    public User() {

    }

    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public User(String username, String password, Gender gender, int age) {
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.age = age;
    }

    public User(String username, String password, Gender gender, int age, Date birthday, Address address) {
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.age = age;
        this.birthday = birthday;
        this.address = address;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public static class Address {
        private String country;
        private String province;
        private String city;

        public Address() {
        }

        public Address(String country, String city, String province) {
            this.country = country;
            this.city = city;
            this.province = province;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public String getProvince() {
            return province;
        }

        public void setProvince(String province) {
            this.province = province;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }
    }
}

本文地址:/Java/2011/10/31/java-reflection-mechanism-output-class-instance-attribute-values