java笔记(30)——反射的 API 及其 使用

文章目录

  • 反射
    • 1. 什么是反射
    • 2. 获取class字段(字节码文件对象)
        • 方式1
        • 方式2
        • 方式3
        • 应用
    • 3. 获取构造方法和权限修饰符
        • 前期准备
        • 获取所有的公共构造方法
        • 获取所有的构造方法
        • 获取无参构造方法
        • 获取一个参数的构造方法
        • 获取一个参数的构造方法
        • 获取两个参数的构造方法
          • 获取权限修饰符
          • 获取参数的个数
          • 获取构造方法中的所有参数
          • 使用反射创建对象(暴力反射)
    • 4. 获取成员变量
        • 前期准备
        • 获取公共成员变量
        • 获取所有的成员变量
        • 获取单个的成员变量
        • 获取私有的单个成员变量
          • 获取权限修饰符
          • 获取成员变量名
          • 获取成员变量的数据类型
          • 获取成员变量记录的值
          • 修改对象里面记录的值
    • 5. 获取成员方法
        • 前期准备
        • 获取类里面所有的方法对象(包含父类中所有的公共方法)
        • 获取类里面所有的方法对象(没有父类方法,但有本类中的私有方法)
        • 获取类中的单个公共方法
        • 获取类中的单个私有方法
          • 获取方法的修饰符
          • 获取方法的名字
        • 获取方法的形参个数
        • 获取方法的所有形参
        • 获取方法抛出的异常
        • 运行获取的方法
    • 6. 反射的使用
        • 获取对象信息并写入文件中

反射

1. 什么是反射

  1. 获取class对象
  2. 获取成员变量、构造方法、成员方法
  3. 获取各个关键字信息

pkcMwUe.md.png

2. 获取class字段(字节码文件对象)

方式1

Class.forName(“全类名”)

注意:此方法在源代码阶段,java文件编译成class文件的时候使用

方式2

类名.class

注意:此方法在加载阶段,运行代码前需要将class文件加载进入内存的时候

方式3

对象.getClass();

注意:此方法在程序的运行阶段使用

应用
package com.itchen.reflect;public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {Class clazz = Class.forName("com.itchen.reflect.Student");System.out.println(clazz);Class clazz2 = Student.class;System.out.println(clazz.equals(clazz2));Student s = new Student();Class clazz3 = s.getClass();System.out.println(clazz2.equals(clazz3));}
}

3. 获取构造方法和权限修饰符

前期准备
// 获取class对象
Class clazz = Class.forName("com.itchen.reflect.Student");
获取所有的公共构造方法
// 获取所有的公共构造方法
Constructor[] cons1 = clazz.getConstructors();
for(Constructor cos:cons1){System.out.println(cos);
}
获取所有的构造方法
// 获取所有的构造方法
Constructor[] cons2 = clazz.getDeclaredConstructors();
for (Constructor constructor : cons2) {System.out.println(constructor);
}
获取无参构造方法
// 获取无参构造方法
Constructor con1 = clazz.getDeclaredConstructor();
System.out.println(con1);
获取一个参数的构造方法
Constructor con2 = clazz.getDeclaredConstructor(String.class);
System.out.println(con2);
获取一个参数的构造方法
Constructor con3 = clazz.getDeclaredConstructor(int.class);
System.out.println(con3);
获取两个参数的构造方法
Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
System.out.println(con4);
获取权限修饰符
int modifiers = con4.getModifiers();
System.out.println("权限修饰符字段为:"+modifiers);
获取参数的个数
int count = con4.getParameterCount();
System.out.println("参数个数为:"+count);
获取构造方法中的所有参数
Parameter[] parameters = con4.getParameters();
for (Parameter parameter : parameters) {System.out.println(parameter);
}
使用反射创建对象(暴力反射)
con4.setAccessible(true);    // 临时取消权限校验
Student stu = (Student)con4.newInstance("张三", 24);
System.out.println(stu);

4. 获取成员变量

前期准备
// 获取class对象
Class clazz = Class.forName("com.itchen.reflect.Student");
获取公共成员变量
// 获取公共成员变量
Field[] fields = clazz.getFields();
for (Field field : fields) {System.out.println(field);
}
获取所有的成员变量
// 获取所有的成员变量
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {System.out.println(field);
}
获取单个的成员变量
Field gender = clazz.getField("gender");
System.out.println(gender);
获取私有的单个成员变量
Field name = clazz.getDeclaredField("name");
System.out.println(name);
获取权限修饰符
int modifiers = name.getModifiers();
System.out.println("此成员变量的权限修饰符为:"+modifiers);
获取成员变量名
String name1 = name.getName();
System.out.println("此成员变量的名字为:"+name1);
获取成员变量的数据类型
Class type = name.getType();
System.out.println("成员变量的类型为:"+type);
获取成员变量记录的值
name.setAccessible(true);// 临时取消访问权限
Student s = new Student("张三",32,"m");
String value = (String) name.get(s);
System.out.println(value);
修改对象里面记录的值
name.set(s,"李四");
System.out.println(s);

5. 获取成员方法

前期准备
// 获取class对象
Class clazz = Class.forName("com.itchen.reflect.Student");
获取类里面所有的方法对象(包含父类中所有的公共方法)
Method[] methods = clazz.getMethods();
for (Method method : methods) {System.out.println(method);
}
获取类里面所有的方法对象(没有父类方法,但有本类中的私有方法)
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {System.out.println(method);
}
获取类中的单个公共方法
Method m1 = clazz.getMethod("eat", String.class);
System.out.println(m1);
获取类中的单个私有方法
Method m2 = clazz.getDeclaredMethod("eat", String.class);
System.out.println(m2);
获取方法的修饰符
int modifiers = m2.getModifiers();
System.out.println("此方法的权限修饰符为"+modifiers);
获取方法的名字
String name = m2.getName();
System.out.println("此方法的名字是:"+name);
获取方法的形参个数
int count = m2.getParameterCount();
System.out.println("此方法的形参个数:"+count);
获取方法的所有形参
Parameter[] parameters = m2.getParameters();
for (Parameter parameter : parameters) {System.out.println(parameter);
}
获取方法抛出的异常
Class[] exceptionTypes = m2.getExceptionTypes();
for (Class exceptionType : exceptionTypes) {System.out.println(exceptionType);
}
运行获取的方法
Student s = new Student();
m2.setAccessible(true);
/*** 1. 方法的调用者* 2. 方法调用时传递的实际参数* */
m2.invoke(s,"薯条");

6. 反射的使用

获取对象信息并写入文件中
// Java文件(有业务逻辑)
package com.itchen.reflectTest;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;public class MyReflectDemo {public static void main(String[] args) throws IllegalAccessException, IOException {Student s = new Student("xA",23,'w',167.5,"睡觉");Teacher t = new Teacher("Bn",1000);saveObject(t);}public static void saveObject(Object obj) throws IllegalAccessException, IOException {// 1. 获取字节码文件对象Class clazz = obj.getClass();// 2. 创建io流BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\icyler\\Desktop\\AndroidProject\\shiyan\\mydynamicproxy\\a.txt"));// 3. 获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);// 获取成员变量的名字String name = field.getName();// 获取成员变量的值Object value = field.get(obj);bw.write(name + " = " + value);bw.newLine();}// 4. 关闭io流bw.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结…

Ubuntu更新源

一、sudo apt-get update命令 在Debian系中,Ubuntu是很火的一款开源系统产品。使用sudo apt-get update从我们的更新源中获取并更新系统中软件包的列表信息,sudo apt-get update作用如下: 更新软件包列表: 将本地软件包列表与远程仓库中的最…

二叉树第二期:堆的实现与应用

若对树与二叉树的相关概念,不太熟悉的同学,可移置上一期博客 链接:二叉树第一期:树与二叉树的概念-CSDN博客 本博客目标:对二叉树的顺序结构,进行深入且具体的讲解,同时学习二叉树顺序结构的应用…

[数据集][目标检测]桥梁检测数据集VOC+YOLO格式1116张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1116 标注数量(xml文件个数):1116 标注数量(txt文件个数):1116 标注…

《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch8 值函数拟合 【基于近似函数的 TD 算法:Sarsa、Q-leaning、DQN】

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、学堂在线 视频 习题 2、相应章节 过电子书 复习 【下载: 本章 PDF GitHub 页面链接】 3、 MOOC 习题 跳过的 PDF 内容 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址…

【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展

1 定义与优点 1.1 定义 策略模式(Strategy Pattern)属于对象的⾏为模式。他主要是用于针对同一个抽象行为,在程序运行时根据客户端不同的参数或者上下文,动态的选择不同的具体实现方式,即类的行为可以在运行时更改。…

MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束)

目录 一、初始数据库 二、概念 三、DDL建库建表 1. 数据库结构 2. SQL语句分类 3. DDL语句操作数据库 注释: 查看数据库: ​编辑创建数据库: 删除数据库: 选择数据库: 4. 数据库表的字段类型 4.1 字符串…

java将html转成图片

java 将html转成图片 1.导入jar2.代码3.展示结果4.注意事项 最近有一个需求需要根据指定的样式生成图片&#xff0c;使用java原生技术有些麻烦&#xff0c;所以上网搜了下案例&#xff0c;最后发现最好用的还是html2image&#xff0c;这里进行简单总结下。 1.导入jar <!-- 用…

腾讯视频VIP会员账号怎么扫码登录一个帐号登录几个人的设备?

腾讯视频VIP会员账号怎么扫码登录&#xff1f; 腾讯视频VIP会员账号要想实现扫码登录&#xff0c;仅支持在电脑Web网页版和WindowsPC软件上登录腾讯视频时&#xff0c;才可以实现手机QQ扫码登录腾讯视频。 腾讯视频VIP与SVIP会员有什么区别&#xff1f; 腾讯视频VIP会员&…

前端小白必学:对Cookie、localStorage 和 sessionStorage 的简单理解

前言 Cookie、localStorage 和 sessionStorage 作为Web开发领域中广泛采用的三种客户端数据存储技术&#xff0c;它们各自拥有独特的优势、应用场景及限制条件&#xff0c;共同支撑起前端数据管理的多样化需求。也是面试常考题之一&#xff0c;今天就和大家简单谈一下我对它们…

揭开大语言模型(LLM)内部运作的算法逻辑

本文探讨了 Anthropic 的突破性技术&#xff0c;以揭示大型语言模型 (LLM) 的内部工作原理&#xff0c;揭示其不透明的本质。通过深入研究LLM Claude Sonnet 的“大脑”&#xff0c;Anthropic 增强了人工智能的安全性和可解释性&#xff0c;为人工智能的决策过程提供了更深入的…

应用部署方式演变

应用部署方式演变 1.传统部署2.虚拟化部署3.容器化部署 1.传统部署 传统的应用程序部署是将多个应用程序直接部署在操作系统上&#xff0c;一旦其中的某个应用程序出现内存泄漏&#xff0c;那么该程序就会大量吞噬系统内容空间&#xff0c;导致其他应用程序无法正常运行。 2.虚…

如何让两个不同网段的直连地址通信(有点意思)

群里一个朋友出了个题&#xff1a;两个路由器接口直连&#xff0c;一个接口IP是1.1.1.1/30&#xff0c;一个接口IP是2.2.2.2/30&#xff0c;如何让它们通信&#xff1f; 群里的朋友们纷纷献策&#xff1a; 1、用PPP方式连接&#xff0c;直接通 2、配对端IP地址同网段的s…

鱼叉式钓鱼

鱼叉式网络钓鱼&#xff1a; 鱼叉式网络钓鱼是一种网络钓鱼形式&#xff0c;它针对特定个人或组织发送定制消息&#xff0c;旨在引发特定反应&#xff0c;例如泄露敏感信息或安装恶意软件。这些攻击高度个性化&#xff0c;使用从各种来源收集的信息&#xff0c;例如社交媒体资…

Face Adapter - 一键面部表情迁移、换脸工具 本地一键整合包下载

Face Adapter是一款高效的人脸编辑适配器&#xff0c;由浙江大学和腾讯联合开发&#xff0c;适用于预先训练的扩散模型&#xff0c;专门针对人脸再现和交换任务。 只需要上传一张源脸和一张参考人脸&#xff0c;就能按照参考人脸的风格生成相同的面部的表情&#xff0c;一键生…

掌握Python编程的深层技能

一、Python基础语法、变量、列表、字典等运用 1.运行python程序的两种方式 1.交互式即时得到程序的运行结果 2.脚本方式把程序写到文件里(约定俗称文件名后缀为.py),然后用python解释器解释执行其中的内容2.python程序运行的三个步骤 python3.8 C:\a\b\c.py 1.先启动python3…

Golang-channel理解

channel golang-channel语雀笔记整理 channelgolang channel的设计动机&#xff1f;chanel的数据结构/设计思考 golang channel的设计动机&#xff1f; channel是一种不同协程之间实现异步通信的数据结构。golang中有一种很经典的说法是要基于通信实现共享内存&#xff0c;而不…

机器学习基础:开源库学习-Numpy科学计算库

目录 Numpy科学计算库 什么是多维数组 数组基础 高维数组 操作和创建数组 Numpy介绍 创建数组 数组的属性 二维数组 三维数组 数组元素的数据类型 创建特殊的数组 np.arange() np.ones() np.zeros() np.eye() np.linspace() np.logspace() asarray() 数组运…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…