Java中反射 API 的使用

一、什么是反射:

  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法(包括私有的方法和属性),对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的功能就称为java语言的反射机制。通俗点讲,通过反射可以获取该类所有的属性和方法。

二、API 使用:

    public static void test() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 1、获取字节码文件的三种方法
        Class psnClass =  Class.forName("model.Person");  //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。
        Class psnClass2 = Person.class; // 当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。
        Person s = new Person();
        Class psnClass3 = s.getClass(); // 通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 


        //通过字节码对象调用无参构造器创建Person实例对象
        Person person = (Person) psnClass.newInstance();
        person.getNameAndAge();


        //通过字节码对象获取有参构造器对象,创建Person实例对象
        Constructor constructor = psnClass.getConstructor(int.class, String.class);
        Person person1= (Person) constructor.newInstance(18,"wu");
        person1.getNameAndAge();

        Constructor[] constructors = psnClass.getConstructors();
        for (Constructor c : constructors) {
            System.out.println("构造器:" + c.getName());
        }

        // 获得指定方法
        Method getName = psnClass.getDeclaredMethod("getName");
        getName.setAccessible(true); // 设置可访问
        getName.invoke(person); // 执行方法

        Method[] declaredMethods = psnClass.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.out.println("方法名: " + m.getName());
            m.setAccessible(true);
            m.invoke(person1);
        }

        // 获得私有属性
        Field name = psnClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(person,"li");

        Method getNameLi = psnClass.getDeclaredMethod("getName");
        getName.setAccessible(true);
        getName.invoke(person);

        Field[] fields = psnClass.getDeclaredFields();
        for (Field f : fields) {
            System.out.println("成员变量: " + f.getName());
        }
        
    }

 

posted @ 2019-02-21 14:31  吴wuwu  阅读(1188)  评论(0编辑  收藏  举报