zoukankan      html  css  js  c++  java
  • 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());
            }
            
        }
  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/haiyangwu/p/10321264.html
Copyright © 2011-2022 走看看