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); 
相关推荐
Good Note1 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
我就是我35237 分钟前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆40 分钟前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole1 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
全栈若城2 小时前
03 Python字符串与基础操作详解
java·开发语言·python
伯牙碎琴2 小时前
二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)
java·spring·log4j
菲力蒲LY2 小时前
输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
java·前端·mybatis
南宫生2 小时前
力扣每日一题【算法学习day.130】
java·学习·算法·leetcode
!!!5252 小时前
Java实现斗地主-做牌以及对牌排序
java·算法