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());
            }
            
        }
  • 相关阅读:
    mysql六:数据备份、pymysql模块
    mysql三:表操作
    mysql四:数据操作
    剑指offer-数组
    剑指offer-回溯
    中缀表达式到后缀表达式的转换
    大数取余算法的证明及实现
    Windows下匿名管道进程通信
    Windows下使用命令行界面调用VS2015编译器编译C++程序方法
    6 个技巧,提升 C++11 的 vector 性能
  • 原文地址:https://www.cnblogs.com/haiyangwu/p/10321264.html
Copyright © 2011-2022 走看看