反射的概念

反射允许对成员变量,成员方法和构造方法的信息进行编程访问

idea中的提示就是反射的功能反射需要获取字节码class文件,在通过class对象来获取字段,构造方法,成员方法,最后从这些中解剖出修饰符,名字等等信息

源代码阶段:用一

加载阶段:用二

运行阶段:用三

构造方法的对象:Constructor

字段(成员变量)的对象:Field

成员方法的对象:Method

反射获取构造方法

java 复制代码
static void main() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取class对象
        Class clazz = Class.forName("reflect2.Student");
        //获取构造方法(getConstructors只能获取public修饰的构造方法)
        /*Constructor[] cons = clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }*/
        //获取构造方法(getDeclaredConstructors可以获取全部的构造方法)
        /*Constructor[] cons = clazz.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }*/
        //无参构造的方法
        Constructor con1 = clazz.getDeclaredConstructor();
        System.out.println(con1);
        //public Student(String name)
        Constructor con2 = clazz.getDeclaredConstructor(String.class);
        System.out.println(con2);
        //protected Student(int age)
        Constructor con3 = clazz.getDeclaredConstructor(int.class);
        System.out.println(con3);
        //   private Student(String name, int age)
        Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
        System.out.println(con4);
        //显示用什么修饰符
        //1表示public
        //2表示private
        int modifiers = con4.getModifiers();
        System.out.println(modifiers);
        //参数里是String,int修饰的
        Parameter[] parameters = con4.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        //暴力反射:表示临时取消权限校验
        con4.setAccessible(true);
        Student stu = (Student) con4.newInstance("张三", 10);
        System.out.println(stu);
    }

Student类:

java 复制代码
public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(String name){
        this.name = name;
    }

    protected Student(int age){
        this.age = age;
    }

    private Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

结果:

反射获取成员变量:

MyReflectDemo类:

java 复制代码
static void main() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class clazz = Class.forName("reflect3.Student");
        //获取所有的成员变量
        /*Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }*/
        //获取单个的成员变量
        Field names = clazz.getDeclaredField("name");
        System.out.println(names);
        //获取权限修饰符
        int modifiers = names.getModifiers();
        System.out.println(modifiers);
        //获取成员变量的名字
        String str = names.getName();
        System.out.println(str);
        //获取成员变量的数据类型
        Class<?> type = names.getType();
        System.out.println(type);
        //获取成员变量记录的值
        Student s = new Student("zhangsan",10,"男");
        names.setAccessible(true);
        Object value = names.get(s);
        System.out.println(value);
        //修改对象里面记录的值
        names.set(s,"lisi");
        System.out.println(s);
    }

Student类:

java 复制代码
 private String name;
    private int age;
    public String gender;

输出结果:

'\

反射获取成员方法:

相关推荐
7澄131 分钟前
Java Socket 网络编程实战:从基础通信到线程池优化
java·服务器·网络·网络编程·socket·多线程·客户端
Pocker_Spades_A32 分钟前
DeepCore:大模型统一网关,Claude 免费体验与跨模型技术洞察
java·服务器·数据库
周杰伦_Jay33 分钟前
【Conda 完全指南】环境管理+包管理从入门到精通(含实操示例+表格对比)
开发语言·人工智能·微服务·架构·conda
努力学习的小廉35 分钟前
【QT(一)】—— QT Creator的安装与使用
开发语言·qt
Arva .37 分钟前
Spring Boot自动配置原理
java·spring boot·后端
寻星探路38 分钟前
Java EE初阶启程记15---文件操作和IO
java·java-ee
阿巳helloWorld39 分钟前
SpringMVC底层流程解析
java·开发语言
heartbeat..40 分钟前
介绍java中常用于处理 Excel 文件的Apache POI
java·apache·excel·poi
路边草随风40 分钟前
java 实现 flink 读 kafka 写 iceberg
java·flink·kafka