反射的概念

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

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;

输出结果:

'\

反射获取成员方法:

相关推荐
计算机程序设计小李同学5 分钟前
基于SSM框架的动画制作及分享网站设计
java·前端·后端·学习·ssm
鱼跃鹰飞17 分钟前
JMM 三大特性(原子性 / 可见性 / 有序性)面试精简版
java·jvm·面试
jghhh0122 分钟前
传递对准MATLAB仿真程序
开发语言·matlab
该怎么办呢42 分钟前
基于cesium的三维不动产登记系统的设计与实现(毕业设计)
java·毕业设计
J不A秃V头A1 小时前
多任务执行时,共享请求对象被并发修改
java
heartbeat..1 小时前
零基础学 SQL:DQL/DML/DDL/DCL 核心知识点汇总(附带连接云服务器数据库教程)
java·服务器·数据库·sql
编程武士1 小时前
Python 各版本主要变化速览
开发语言·python
hqwest1 小时前
码上通QT实战29--系统设置04-用户操作管理
开发语言·qt·模态窗体·addbindvalue·bindvalue
专注于大数据技术栈2 小时前
java学习--LinkedHashSet
java·开发语言·学习
这个图像胖嘟嘟2 小时前
前端开发的基本运行环境配置
开发语言·javascript·vue.js·react.js·typescript·npm·node.js