java反射

一、什么是反射?

反射(Reflection)

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。反射是一种强大的特性,允许程序在运行时检查和修改类、方法、字段等的信息,以及动态创建对象、调用方法和访问属性。

1、反射第一步:加载类,获取类的字节码:class对象

获取Class对象的三种方式

  • Class c1 = 类名.class

    // 比如说我现在有一个Student类
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student(){

    复制代码
    private String name;
    private int age;

    }

    Class c1 = Student.class;
    System.out.println(c1.getName()); //全类名
    System.out.println(c1.getSimpleName()) //简名:Student

  • 调用Class提供方法: public static Class forName(String package);

    Class c2 = Class.forName("com.brook.domain.Student"); // 需要全类名
    System.out.println(c1 == c2) //其实拿到的同一个对象,因为我内存中就只有这一个对象

  • object提供的方法:public Class getClass(); Class c3 = 对象.getClass();

    Student student = new Student();
    Class c3 = student.getClass(); // 也是同一个对象,因为这个类的字节码文件在内存中就只有一份

2、获取类的构造器

Class提供了从类中获取构造器的方法。

1、获取类的全部构造器(只能获取public修饰的)

复制代码
Constructor[] constructor = c.getConstructors();

2、获取全部构造器(只要存在就可以获取)

复制代码
Constructor[] constructor = c.getDeclaredConstructors();

3、获取某个构造器(只能获取public修饰的)

复制代码
Constructor constructor = c.getConstructor(); //无参数构造器 只能获取public修饰的

Constructor constructor1 = c.getDeclaredConstructor(); //无参数构造器,只要定位到都可以获取

Constructor constructor2 = c.getConstructor(String.class,int.class); //有参数构造器 只能获取public修饰的

Constructor constructor3 = c.getDeclaredConstructor(String.class,int.class); //有参数构造器,只要定位到都可以获取

获取类构造器的作用:初始化对象返回

复制代码
constructor1.setAccessible(true); //禁止检查访问权限 可以访问private修饰的构造器
Student student = (Student)constructor1.newInstance();

3、获取类的成员变量

class通过了从类中获取成员变量的方法。

复制代码
Field[] fields = c.getDeclaredFields(); // 获取类的全部成员变量
// 只要存在就能获取
Field sName = c.getDeclaredFirld("name"); //定位某个成员变量 ------>只要存在就可以获取

获取到成员变量的作用:赋值、取值。

复制代码
Student student = new Student();
student.setAccessible(ture); //禁止访问控制权限
sName.set(student,"张三");
System.out.println(student);

4、获取类的成员方法

Class提供了从类中获取成员方法的API

复制代码
Method[] methods = c.getDeclaredMethods(); // 获取类的全部成员方法
Method run = c.getDeclaredMethods("run"); //获取某个方法对象 无参的
Method eat= c.getDeclaredMethods("eat",string.class); //获取某个方法对象 有参的

获取到成员方法执行:

复制代码
Student student = new Student();
run.setAccessible(true);
Object rs = run.invoke(student) //调用无参的run方法,用student对象触发调用,返回方法的返回值
System.out.println(rs);

run.setAccessible(true);
String rs2 = (String)eat.invoke(student,"米饭");
System.out.println(rs2); 
相关推荐
XS03010613 分钟前
Java基础 map集合
java·哈希算法·散列表
凤山老林1 小时前
从0到1搭建企业级权限管理系统:Spring Boot + JWT + RBAC实战指南
java·spring boot·后端·权限管理·rbac
逍遥德1 小时前
AI时代,计算机专业大学生学习指南
java·javascript·人工智能·学习·ai编程
Maiko Star1 小时前
让 AI 开口说话:Spring AI Alibaba 语音合成(TTS)实战
java·人工智能·spring·springai
programhelp_2 小时前
Pinterest OA 题库大公开|Programhelp 独家整理(最新高频)
java·开发语言
likerhood2 小时前
Fastjson中的JSON.parseObject()详细讲解
java·json
KNeeg_2 小时前
黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐
java·redis·后端·spring·面试·职场和发展·黑马点评
铁皮哥3 小时前
【后端/Agent 开发】给你的项目配置一套 .claude/ 工作流:别再裸用 Claude Code 了!
java·windows·python·spring·github·maven·生活
乐之者v3 小时前
AI编程 -- codex添加代码,在intellij Idea中没有显示,如何处理?
java·ide·intellij-idea
2401_878820473 小时前
Sa-Token基础篇
java·spring boot·后端·sa-token