码迷,mamicode.com
首页 > 编程语言 > 详细

java - 反射

时间:2016-10-26 00:27:04      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:access   string类   close   比较   open   tcl   blog   ini   static   

测试类:

技术分享
public class Test01 {

    private String name;
    private String sex;
    private Long num;

    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 Long getNum() {
        return num;
    }

    public void setNum(Long num) {
        this.num = num;
    }

}
View Code

1、获取对象字段

public class Test05 {

    public static void main(String[] args) {
        List<String> fieldList = getClassFields(new Test01().getClass());
        for (String field : fieldList) {
            System.out.println(field);
        }
    }
    
    /**
     * 获取字段列表
     * @param clazz 类
     * @return
     */
    private static List<String> getClassFields(Class<?> clazz){
        Field[] fieldArr  = clazz.getDeclaredFields();
        List<String> fieldList = new ArrayList<String>();
        for (Field field : fieldArr) {
            fieldList.add(field.getName());
        }
        return fieldList;
    }
}

运行main方法结果:

技术分享

 

2、字段类型

    /**
     * 测试字段类型
     */
    private static void testFieldType(Class<?> clazz){
        Field[] fieldArr  = clazz.getDeclaredFields();
        for (Field field : fieldArr) {
            System.out.println(field.getType());
        }
    }

测试结果:

技术分享

 

3、字段类型比较

    /**
     * 测试字段类型
     */
    private static void test03(Class<?> clazz){
        Field[] fieldArr  = clazz.getDeclaredFields();
        for (Field field : fieldArr) {
            if(field.getType().equals(Long.class))
                System.out.println("Long类型,字段:"+field.getName());
            else if(field.getType().equals(String.class))
                System.out.println("String类型,字段:"+field.getName());
        }
    }

运行结果:

技术分享

 

4、获取类指定字段值

    /**
     * 获取字段值, get方法
     * @param thisClass 类
     * @param fieldName 字段名
     * @return
     */
    private static Object getFieldValue(Object thisClass, String fieldName) {
        Object value = new Object();
        Method method = null;
        try {
            String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            method = thisClass.getClass().getMethod("get" + methodName);
            value = method.invoke(thisClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    } 
    /**
     * 测试指定字段值
     * @param clazz
     */
    private static void test05(Object obj, String[] fieldArr){
        for (String fieldName : fieldArr) {
            System.out.println("字段:"+ fieldName +", 值:"+ getFieldValue(obj, fieldName));
        }
    }
    public static void main(String[] args) {
        Test01 test = new Test01();
        test.setName("1");
        test.setSex("2");
        test.setNum(1000L);
        
        String[] fieldArr = new String[]{"name", "sex", "num"};
        test05(test, fieldArr);
    }

运行结果:

技术分享

 

5、通过反射设置值

    /**
     * 测试反射设置属性
     * @param obj
     */
    private static Object test06(Object obj) throws Exception{
        Class<?> clazz = obj.getClass(); //
        Field[] fieldArr  = clazz.getDeclaredFields();
        
        Object clazzInstance = clazz.newInstance(); // 实例化对象
        for (Field field : fieldArr) {
            field.setAccessible(true); // 设置些属性是可以访问的
            String fieldName = field.getName(); // 字段名称
            Class<?> fieldType = field.getType(); // 字段类型
            
            if (fieldType == Long.class) // long类型只能set数字,不然报错
                field.set(clazzInstance, 88888L);
            else if (fieldType == String.class)
                field.set(clazzInstance, "我是属性【"+ fieldName +"】");
        }
        return clazzInstance;
    }
    public static void main(String[] args) throws Exception {
        Object obj = test06(new Test01());
        Test01 test = (Test01) obj;
        System.out.println("name: "+ test.getName() +", sex: "+ test.getSex() +", num: "+ test.getNum());
    }

运行结果:

技术分享

 

 

大武汉,赶最后一班地铁去喽。 。。 香港路转范湖,范湖转光谷,漫长。。。。。

 

java - 反射

标签:access   string类   close   比较   open   tcl   blog   ini   static   

原文地址:http://www.cnblogs.com/frank-quan/p/5998527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!