反射的概念

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

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;

输出结果:

'\

反射获取成员方法:

相关推荐
SUPER52661 天前
本地开发环境_spring-ai项目启动异常
java·人工智能·spring
moxiaoran57531 天前
Spring AOP开发的使用场景
java·后端·spring
小王师傅661 天前
【轻松入门SpringBoot】actuator健康检查(上)
java·spring boot·后端
Larry_Yanan1 天前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼1 天前
Java classloader
java·开发语言·python
superman超哥1 天前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
专注于大数据技术栈1 天前
java学习--StringBuilder
java·学习
loosenivy1 天前
企业银行账户归属地查询接口如何用Java调用
java·企业银行账户归属地·企业账户查询接口·企业银行账户查询
小鸡吃米…1 天前
Python - 继承
开发语言·python
IT 行者1 天前
Spring Security 6.x 迁移到 7.0 的完整步骤
java·spring·oauth2