Java采用反射技术创建对象后对目标类的成员变量和成员方法进行访问

实现: 

package com.ljy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 
* @ClassName: MethodFieldTest
* @Description: 采用反射技术创建对象后对目标类的成员变量和成员方法进行访问
* @author ljy
* @date 2019年9月12日 下午2:51:52
*
 */
public class MethodFieldTest {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class clazz = Class.forName("com.ljy.Teacher");
            // 动态创建Teacher对象
            Object obj = clazz.newInstance();
            
            /**
             * 采用反射技术创建对象后对目标类的成员变量进行访问
             */
            // 调用getDeclaredField()方法取得name的属性对应的Field对象
            Field field = clazz.getDeclaredField("name");
            // 取消属性的访问控制权限,即使private属性也可以进行访问
            field.setAccessible(true);
            // 调用get()方法取得对应的属性值 , field.get(obj)相当于obj.getName()
            System.out.println("初始值:name="+field.get(obj));
            // 调用set()方法给对应属性赋值
            field.set(obj, "团团");
            // 调用get()方法取得对应的属性修改后的值
            System.out.println("赋值后:name="+field.get(obj));
            
            /**
             * 采用反射技术创建对象后对目标类的成员方法进行访问
             */
            // 调用getDeclaredMethod方法取得Teacher类中setSex()方法对应的Method对象
            Method method = clazz.getDeclaredMethod("setSex", new Class[]{String.class});
            // 调用invoke()方法调用method对象代表的方法
            Object result = method.invoke(obj, new Object[]{"男"});
            
            // 取得sex的属性对应的Field对象
            field = clazz.getDeclaredField("sex");
            // 取消属性的访问控制权限,即使private属性也可以进行访问 (每次重新给field赋值后都要重新给权限)
            field.setAccessible(true);
            // 调用get()方法取得对应的属性修改后的值
            System.out.println("sex="+field.get(obj));
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
}

 

Teacher类(目标类):

package com.ljy;

public class Teacher {
    private Integer id;
    private String name;
    private String sex;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    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 Teacher(Integer id, String name, String sex) {
        super();
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
    public Teacher(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }
    public Teacher() {
    }
    @Override
    public String toString() {
        return "Teacher [id=" + id + ", name=" + name + ", sex=" + sex + "]";
    }
    
    
}

 

 

posted @ 2019-09-12 15:16  我好高冷  阅读(225)  评论(0编辑  收藏  举报