反射的概念

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

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;

输出结果:

'\

反射获取成员方法:

相关推荐
步步为营DotNet13 分钟前
深度解析CancellationToken:.NET中的优雅取消机制
java·前端·.net
冷雨夜中漫步8 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30739 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919109 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble10 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟10 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖10 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_7634724611 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法