java反射学习---获取私有属性与私有方法

 
  
Class对象存储在类的字节码文件中,Class对象没有公共的构造方法
Class对象是在类加载时由java虚拟机或者类加载器的方法自动构造
不能显示的声明一个Class对象
getField getFields 与getMethod getMethods只能返回公共的属性
getDeclaredField getDeclaredFields 与getDeclaredMethod getDeclaredMethods 能获得该类(不包含超类)的属性方法,包括private
反射在获取私有方法时可直接通过getDeclaredMethod获取,除了invoke该方法时,调用方法的getName等一般方法时不需要通过
setAccessible(true)后取访问,而调用该方法时必须通过setAccessible(true)避开访问修饰的检查后,才能调用
私有属性的原理同上。
public class User {
    private int id;
    private String name;
    private String sex;

    public int getId() {
        return id;
    }

    public User(int id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public User() {
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    @Override
    public String toString() {
        return "id="+this.id+",name="+this.name+",sex="+this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    private void so(){
        System.out.println("私有的方法");
    }
    private String test(String s){
        System.out.println(s);
        return s;
    }
}

测试代码:

package reflection;

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


public class test {
    public static void main(String[] args) throws Exception {
     
        //方法的调用
        Class aClass = Class.forName("reflection.User");
        //User user = (User) aClass.newInstance(); //默认调用无参构造
        //调用有参构造
        User user= (User)aClass.getConstructor(int.class, String.class, String.class).newInstance(1, "张三", "男");
        System.out.println(user);
        Method setName = aClass.getDeclaredMethod("setName", String.class);
        setName.invoke(user,"李四");
        System.out.println(user);
        //属性的调用

        //能访问到该类所有的方法
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method method:declaredMethods){
            System.out.println(method.getName()+"--"+method.getModifiers()+"--"+method.getReturnType());
        }

       //获取私有方法
        Method so = aClass.getDeclaredMethod("so",new Class[]{});
        System.out.println(so.getReturnType());
        //调用私有方法
        Method test = aClass.getDeclaredMethod("test",String.class);
        test.setAccessible(true);
        test.invoke(user,"测试私有方法");

        //访问私有属性
        Field name = aClass.getDeclaredField("name");
        //更改反射访问的访问修饰检查
        name.setAccessible(true);
        name.set(user,"王五");
        System.out.println(user);

        //反射创建数组 Array类
        //一维数组
        Class stringClass = String.class;
        Object array = Array.newInstance(stringClass, 5);
        Array.set(array,3,"三三三");
        System.out.println(Array.get(array,3));
        //二维数组 3*3
        int[] dimens={3,3};
        Object arrs = Array.newInstance(int.class, dimens);
        Object arr = Array.get(arrs, 2);
        Array.setInt(arr,1,10);
        Array.setInt(arr,2,11);
        int[][] ints = (int[][]) arrs;
        System.out.println(ints[2][2]);


    }
}

你可能感兴趣的:(java反射学习---获取私有属性与私有方法)