Java中的反射以及使用方法

news/2024/10/17 22:23:57/

一. 简介

在程序运行阶段, 动态获取一个类中的属性或者方法, 把这种机制成为反射机制. 可以说, 没有反射就没有Java的任何框架

二. 应用

产生对象

假设有一个Student对象

public class Student {private String name;public int age;static int nationality;public Student() {System.out.println("Student类的无参构造");}Student(String name) {System.out.println("Student的一个参数的有参构造");}private Student(String name,int age) {this.name = name;this.age = age;System.out.println("Student类的有参构造");}public void fun(int[] arr) {System.out.println("public权限的成员方法 fun");}private String getName() {return this.name;}public static void test() {System.out.println("Student的静态方法test");}
}

*获取class对象

要用反射操作某个类, 需要先获取该类的class对象
获取class对象的三个方式:
Class<类名> cls = (Class<类名>) Class.forName("包名.类名")
Class<类名> cls = Student.class
Class<类名> cls = (Class<类名>) new Student().getClass()
例如Student对象的获取:

Class<Student> cls1 = (CLass<Student>) Class.forName("reflect.Student");
Class<Student> cls2 = Student.class;
Class<Student> cls3 = (Class<Student>) new Student().getClass();

不过一般使用第②个方法,写法简单

通过反射产生对象

Class类的newInstance()方法

例如对于Student类: Student stu1 = cls2.newInstance();
默认调用的是无参构造, 而且该构造方法必须是public权限

通过Constructor调用构造方法

Constructor类是Java中利用反射操作构造方法的类
两个方法:
getConstructor(参数): 获取该类的所有(加s)public权限的构造方法
getDeclaredConstructor(参数): 获取该类的所有(加s)权限的构造方法, 包括private, default权限

Class<Student> cls2 = Student.class;
//获取该类的所有权限的构造方法
Constructor<Student>[] constructors = cls2.getDeclaredConstructors();
//获取私有的有参构造:private Student(String name,int age),参数对应上
Constructor<Student> constructor = cls2.getDeclaredConstructor(String.class, int.class);//破坏封装性,调用私有构造方法
constructor.setAccessible(true);
//要用下面的方法, 不可以用new Student()
Student stu2 = constructor.newInstance("小明",18);

通过反射操作类中方法

getMethod(): 获取所有(加s)公共方法
getDeclaredMethod(): 获取类中所有(加s)方法

//接着上面
Method[] methods = cls2.getDeclaredMethods();
//此时数组里就包含了所有的方法以及权限//调用普通方法与静态方法
//调用普通方法都要产生对象
Student student = cls2.newInstance();
//获取方法(参数1:方法的名字, 后面的参数就是方法的参数)
Method methodFun = cls2.getDeclaredMethod("fun",int[].class);
//调用方法(参数1是对象,后面是方法参数)
methodFun.invoke(student, new int[]{1,2,3,4,5});//通过反射调用静态方法
Method methodTest = cls2.getDeclaredMethod("test");
//不需要对象即可调用
methodTest.invoke(null);

通过反射操作类中属性

getField(): 获取所有(加s)public方法
getDeclaredField(): 获取所有(加s)方法, 包括private

//获取class对象
Class<Student> cls = Student.class;
//实例化对象
Student stu = cls.newInstance();//用cls.getDeclaredField()获取私有属性
Field nameField = cls.getDeclaredField("name");
//设置name属性为可访问
nameField.setAccessible(true);
//修改该对象的该属性
nameField.set(stu,"bob");//获取public属性
Field ageField = cls.getField("age");
//修改该对象的该属性
ageField.set(stu,88);//获取静态属性
Field nationalityField = cls.getField("nationality");
//修改属性
nationalityField.set(null,"USA");//经过检查,修改都生效了
System.out.println(Student.nationality);

http://www.ppmy.cn/news/80337.html

相关文章

使用MinIO文件存储系统【完成视频断点续传】业务逻辑

目录 视频上传 接口一&#xff1a;检查该视频/媒资文件是否已经上传完成 接口二&#xff1a;检查视频分块是否已经在minio中已经存在 接口三&#xff1a;上传分块文件到minio中&#xff08;已经上传的分块会在接口二进行校验&#xff09; 接口四&#xff1a;合并上传的分块…

天猫订单之数据分析与挖掘——分类分析

天猫订单之数据分析与挖掘——分类分析 文章目录 天猫订单之数据分析与挖掘——分类分析0. 写在前面1. 分类分析1.1 决策树预测1.2 随机森林1.3 朴素贝叶斯算法0. 写在前面 Windows:Windows10Python:Python3.9本次案例项目主要是采用Pandas和Numpy对天猫订单数据集进行处理、…

linux共享内存总结

共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成 头文件&#xff1a; #include <sys/ipc..h> #include<sys/shm.h> // 创建或获取一个共享内存: 成功返回共享内存ID&#xff0c;失败返回-1 int shmget (key_t key, size_t_size, int flag); // 连接共享内…

图片翻译怎么弄?如何把图片翻译成中文?

在使用社交媒体时&#xff0c;可能会遇到来自世界各地的异文化信息&#xff0c;这时我们可以借助图片翻译的方法帮助我们更好地了解这些信息&#xff0c;促进跨文化交流。那么图片翻译怎么弄呢&#xff1f;图片翻译的方法有哪些呢&#xff1f;这篇文章给你推荐三个非常好用的图…

ROS学习(5)——话题消息与服务

节点之间的消息通信分为几种形式&#xff1a; 话题(topic):单向消息发送/接收方式服务(service):双向消息请求/响应方式动作(action):双向消息目标(goal)/结果(result)/反馈(feedback)方式参数服务器(参数共享模式) 种类区别话题异步单向连续单向的发送/接收数据的情况服务同步…

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

Vue电商项目--平台售卖属性和的排序操作制作

平台售卖属性的操作 就是点击平台的售卖属性&#xff0c;下面显示对应的内容 这里我们要借助这个props属性 这里块是平台的售卖属性&#xff0c;我们在这里绑定回调&#xff0c;一点击就把id传给父组件 我们需要把这俩个参数传进入 商品属性的数组: ["属性ID:属性值:…