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

news2024/11/24 23:51:31

文章目录

  • 反射
    • 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.coloradmin.cn/o/1879477.html

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

相关文章

查看Linux系统中用过什么命令 history

提示:以下所有命令都在Ubuntu-24.04-live-server-amd64系统中运行 文章目录 前言一、基本用法:二、查看其他用户历史三、增加时间戳结语 前言 history 命令用于显示和操作当前用户在当前会话中执行过的命令历史记录。它是 Bash shell 的内置命令&#x…

架构设计上中的master三种架构,单节点,主从节点,多节点分析

文章目录 背景单节点优点缺点 主从节点优点缺点 多节点优点缺点 多节点,多backup设计优点缺点 总结 背景 在很多分布式系统里会有master,work这种结构。 master 节点负责管理资源,分发任务。下面着重讨论下master 数量不同带来的影响 单节点 优点 1.设…

PTA:7-194 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。

作者 苑丽红 单位 长春理工大学 中国古代著名算题。原载《孙子算经》:“今有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何?”。本题要求:设某物数量是 N,且三三数剩 x,五五…

如何在Ubuntu20上离线安装joern(包括sbt和scala)

在Ubuntu 20上离线安装Joern,由于Joern通常需要通过互联网从其官方源或GitHub等地方下载,但在离线环境中,我们需要通过一些额外的步骤来准备和安装。(本人水平有限,希望得到大家的指正) 我们首先要做的就是…

Excel 快速查询工具 2023.7.1 更新

Excel 快速查询工具作者表示这个软件是因为有时候需要在 Excel 和网站之间进行切换非常的麻烦,这款软件可以以半透明的方框位于桌面上。 特点 软件窗口半透明并至于顶部,无需来回切换界面。 实时查询,不用点击查询或者按回车之类的&#x…

什么是Cookie?有什么用?如何清除浏览器中的Cookie?

互联网上的每一次点击和每一个选择都可能被一种名为Cookie的技术记录下来。但Cookie是什么?我们在网站上登录时,为什么经常会被问及是否接受Cookie?接受Cookie登录会不会影响我们的在线隐私? Cookie是什么? Cookie是一…

vue3 全局引入 onMounted, reactive, ref 的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

LLM——10个大型语言模型(LLM)常见面试题以及答案解析

今天我们来总结以下大型语言模型面试中常问的问题 1、哪种技术有助于减轻基于提示的学习中的偏见? A.微调 Fine-tuning B.数据增强 Data augmentation C.提示校准 Prompt calibration D.梯度裁剪 Gradient clipping 答案:C 提示校准包括调整提示,尽量减少产生…

基于大津阈值法和二值化与联通区域标记进行图像目标计数

1 建模 A.读取图像: 1.使用imread函数读取图像文件。 2.如果图像是彩色的,通常需要先转换为灰度图像,因为大津阈值法通常应用于灰度图像。 B.灰度化: 1.如果图像是彩色的,使用rgb2gray函数将其转换为灰度…

Data-Driven Reinforcement Learning for Robotic Manipulation

意思是 不同的任务以及机器人都有单独的数据和模型 未来需要整合 一个大的数据集包含所有的 然后训练一个大模型 以后具体的任务只需要针对这个模型进行微调 challenge bootstrapping with large data 2 3 4 高清图补充

uniapp, ‍[⁠TypeError⁠]‍ “Failed to fetch dynamically imported module“ 报错解决思路

文章目录 1. 背景2. 报错3. 解决思路4. 思考参考1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,在使用第三方插件的过程中,出现下面的报错。 2. 报错 [plugin:vite:import-analysis] Cannot find module ‘D:/leaning/uniapp/demo/jk-uts-udp示例/uni_modules/uts-…

安装maven与nexus

安装maven与nexus Maven官网下载地址:http://maven.apache.org cd /data/software/wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.8-bin.tar.gz# 解压 tar xf apache-maven-3.8.1-bin.tar.gz -C /opt/[rooth…

在Clion使用CubeMX Stm32的步骤

Step1 准备软件,安装环境: 1. cubemx v6.5.0(可以兼容以前版本的project) https://www.st.com.cn/zh/development-tools/stm32cubemx.html STM32CubeMX 默认安装目录, 6.5版本可以兼容老版本 C:\Program Files\STMicroelectroni…

关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与SpringCloudGateway的理解 一. 响应式编程与函数式编程的区别二. 响应式编程中常用的组件2.1 RxJava定义2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常见的四种限流规则 一. 响应式编程与函数式编程的区别 总的来说,响应式编…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构: 如何通过包查找到文件,通过URL对应源码的文件,或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术,pyth…

ctfshow-web入门-命令执行(web66-web70)

目录 1、web66 2、web67 3、web68 4、web69 5、web70 1、web66 show_source 被禁用 highlight_file 发现 flag 不在 flag.php 里面 先使用 scandir() 进行目录扫描: cprint_r(scandir("./")); 当前目录下只有 index.php 和 flag.php 扫一下根目…

DAMA学习笔记(三)-数据架构

1.引言 架构是构建一个系统(如可居住型建筑)的艺术和科学,以及在此过程中形成的成果——系统本身。用通俗的话说,架构是对组件要素有组织的设计,旨在优化整个结构或系统的功能、性能、可行性、成本和用户体验。 对于架…

树莓派安装windows系统

第1步: https://uupdump.net/下载对应的系统文件,所有选择项都默认选择。 第2步: 解压下载后的文件,双击运行下面文件。等待下载完成,等待过程很漫长,很考验耐心。 第3步: 提示已经finish了&…

GBJ406-ASEMI无人机专用整流桥GBJ406

编辑:ll GBJ406-ASEMI无人机专用整流桥GBJ406 型号:GBJ406 品牌:ASEMI 封装:GBJ-4 最大重复峰值反向电压:600V 最大正向平均整流电流(Vdss):4A 功率(Pd):中小功率 芯片个数:…

Java代码基础算法练习-判断密码是否符合要求-2024.06.30

任务描述: 用户密码常常要求密码的长度大于等于6个字符,且必须包含大小写字母和数字。请写 一个函数validatePassword 来验证密码是否有效 解决思路: 输入密码为字符串,函数 validatePassword 对字符串进行 for 循环其中的每个的…