Github代码地址

java反射

 
需要的Student实体类
public class Student {

    private String name = "小黑黑";
    public Integer age;
    protected Date birthday;
    int num;

    static {
        System.out.println("student的静态代码块");
    }

    public static void testStudent() {
        System.out.println("这是静态方法....");
    }

    // 私有的方法
    private int getNum(int num) {

        return num + 10;
    }

    /*
     * 在获取 私有属性值的时候 需要注释掉 private Student() {
     * System.out.println("这是Student无参构造"); }
     */
    public Student() {
        System.out.println("这是Student无参构造");
    }

    public Student(String name, int age, Date birthday) {
        System.out.println("这是Student带参构造");
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getBirthday() {
        return birthday;
    }

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

}

 

测试类代码

public class ReflectTest { // 反射

    /**
     * 所有类的对象 都是Class的实例
     * 所有类的父类都是Object
     */
    @Test
    public void getClassName() {
        Student stu = new Student();
        System.out.println(stu.getClass().getSuperclass());
        System.out.println(Student.class.getSuperclass());
        System.out.println(String.class.getSuperclass());
        System.out.println(Integer.class.getSuperclass().getSuperclass());
    }

    // 三种方式 获取 指定类的 完整限定名
    @Test
    public void getClazz() throws Exception {
        System.out.println(Class.forName("cn.bdqn.test.Student").getName());
        System.out.println(new Student().getClass().getName());
        System.out.println(Student.class.getName());
    }

    // 通过反射获取指定类的信息
    @Test
    public void getMsg() throws Exception {
        Class c = Class.forName("cn.bdqn.test.Student");
        System.out.println("全类名:" + c.getName());
        System.out.println("包名:" + c.getPackage().getName());
        System.out.println("类名:" + c.getSimpleName());

        int num = c.getModifiers();
        System.out.println(num);
        System.out.println(Modifier.toString(num));
    }

    // 通过反射获取属性的信息
    @Test
    public void getFileds() throws Exception {
        Class c = Class.forName("cn.bdqn.test.Student");
        // 获取所有public修饰的字段
        Field[] fields = c.getFields();
        for (int i = 0; i < fields.length; i++) {
            System.out.println(fields[i]);
        }
        System.out.println("获取所有的属性名称****************");
        fields = c.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            System.out.println(fields[i].getName());
        }
        System.out.println("获取所有属性的修饰符*****************");
        // default的int值 是 0
        for (int i = 0; i < fields.length; i++) {
            System.out.println(Modifier.toString(fields[i].getModifiers()));
        }
    }

    // 通过反射观察执行顺序
    @Test
    public void getC() throws Exception {
        Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块
        // Student.testStudent();
        // Student student = new Student(); // 耦合 无参构造
        Student student = (Student) c.newInstance(); // 解耦合 无参构造
    }

    // 通过反射获取类中的构造方法
    @Test
    public void getConstructors() throws Exception {
        Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块
        Constructor[] constructors = c.getDeclaredConstructors();
        for (int i = 0; i < constructors.length; i++) {
            System.out.println("构造的修饰符:"
                    + Modifier.toString(constructors[i].getModifiers()));
            System.out.println("构造的名称:" + constructors[i].getName());
            // 1.8才有getParameterCount
            System.out
                    .println("构造的参数个数:" + constructors[i].getParameterCount());

            Class[] types = constructors[i].getParameterTypes(); // 参数的类型
            for (Class class1 : types) {
                System.out.println("参数的类型:" + class1.getName());
                System.out.println("参数的类型简写:" + class1.getSimpleName());
            }
            System.out.println("******************************");
        }
    }

    // 通过反射获取类中的构造方法
    @Test
    public void setFiledName() throws Exception {
        Student student = Student.class.newInstance();
        Class c = student.getClass();

        // 获取指定的属性
        Field field = c.getDeclaredField("name");
        // 设置属性的访问权限
        field.setAccessible(true);
        System.out.println(field.get(student));
    }

    // 通过反射获取类中的构造方法
    @SuppressWarnings("unchecked")
    @Test
    public void getMethod() throws Exception {
        Student student = Student.class.newInstance();
        Class c = student.getClass();
        System.out.println(student.age);
        Method method = c.getDeclaredMethod("setAge", Integer.class);
        // 执行方法
        method.invoke(student, 50);
        System.out.println(student.age);
        // 执行私有的带有参数的 并且有返回值的方法
        method = c.getDeclaredMethod("getNum", int.class);
        // 开启方法的权限
        method.setAccessible(true);
        int num = (Integer) method.invoke(student, 50);
        System.out.println(num);

    }

}

 

posted @ 2016-11-29 14:15  @小葱拌豆腐  阅读(600)  评论(0编辑  收藏  举报

霸气