初识反射

反射:

  主要是指程序可以访问,监测,修改他本身状态的能力,并根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语意。

  每一个类通过javac.exe编译之后,会产生一个.class文件,在通过类加载器加载.class文件,此.class文件加载到内存之后就是一个运行时的类,存放在缓存区,这个运行时的类本身就是一个实例,一个运行时类只加载一次。

public class Person {
    public int age;
    private  String name;

    public Person() {
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public  void show(){
        System.out.println("我是一个人!");
    }
    private  void  eat(String str){
        System.out.println("我正在吃"+str);
    }
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by 东 on 2016/11/5.
 */
public class TestReflect {
    @Test
    public void test01() {
        //在不应用反射的时候,先获取Person类的对象。但是无法访问private权限的属性和方法。
        Person person = new Person();
        person.setAge(20);
        person.setName("Mr_List");
        System.out.println(person);
        person.show();
    }

    @Test
    public void test02() throws Exception {
        //1.使用反射先获取Person类的class。在java中每个类都会有对应的Class对象,
        // 在编译之后的.class文件中都会有对应的Class对象,用来记录这个类的类型信息。
        Class person_clazz = Person.class;
        Person person = (Person) person_clazz.newInstance();
        /**
         * 获取Person类的public属性
         * */
        Field age_field = person_clazz.getField("age");
        age_field.set(person, 20);
        System.out.println(person);

        /**
         * 获取Person类的私有属性
         * */
        //1.获取类的私有属性
        Field name_field = person_clazz.getDeclaredField("name");
        //2.设置属性为可以修改状态
        name_field.setAccessible(true);
        //3.设置属性值
        name_field.set(person, "List");
        System.out.println(person);

        /*
        * 调用public的方法
        * */
        Method show_method=person_clazz.getMethod("show");
        show_method.invoke(person);

        /**
         * 调用private的方法
         */
        Method eat_method=person_clazz.getDeclaredMethod("eat",String.class);
        //设置方法使可以调用和修改的状态
        eat_method.setAccessible(true);
        eat_method.invoke(person,"面包");
     }
}

  

获取运行时类的Class实例的方法

 1  public void test03() throws ClassNotFoundException {
 2         //1.通过类的.class属性
 3         Class clazz1=Person.class;
 4         System.out.println(clazz1);
 5 
 6         //2.通过类的对象
 7         Person person=new Person();
 8         Class clazz2=person.getClass();
 9         System.out.println(clazz2);
10 
11         //通过Class的静态方法
12         String className="Person";
13         Class clazz3=Class.forName(className);
14         System.out.println(clazz3);
15 
16         //4.通过类加载器
17         ClassLoader classLoader=this.getClass().getClassLoader();
18         Class clazz4=classLoader.loadClass(className);
19         System.out.println(clazz4);
20     }

运行效果:

  

 

posted @ 2016-11-05 21:22  Mr殇城  阅读(127)  评论(0编辑  收藏  举报