案例挑战—java反射

news2025/2/1 3:53:27

这里写目录标题

  • 背景
  • 一、为什么要使用反射?
  • 二、反射的应用
    • 反射常用应用的思维导图
    • 2.1获取class对象的三种方法
        • 示例代码
    • 2.2利用反射获取构造方法
      • 示例代码
    • 2.3利用反射获取成员变量
      • 示例代码
    • 2.4利用反射获取成员方法
  • 三、总结
  • 四、升华

背景

由于在公司自研的新项目架构中使用了大量的反射来提高项目的可复用、灵活性。
项目运用的场景有:
1.程序运行期间动态生成类并进行调用
2.通过反射时间接口的高复用
趁着这个机会博主对反射的基本应用进行汇总和总结。

一、为什么要使用反射?

反射是一项强大的功能。

  1. 它允许你在运行时动态操作类、对象、方法和属性
  2. 它允许你访问类的私有属性和私有方法

二、反射的应用

反射常用应用的思维导图

在这里插入图片描述

2.1获取class对象的三种方法

  1. Class.forName(“全限定类名”)
  2. 类名.class
  3. 对象.getClass();

全限定类名=该类所处的包路径+类名

示例代码

Student类

package com.wangwei.myreflec1;


public class Student {
    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Demo1类

package com.wangwei.myreflec1;


public class Demo1 {

    /*
    获取class对象的三种方式
    1.Class.forName("全限定类名")
    2.类名.class
    3.对象.getClass();
     */

    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.wangwei.myreflec1.Student");
        System.out.println(aClass);

        Class<Student> aClass1 = Student.class;
        System.out.println(aClass1);

        Student student = new Student();
        Class<? extends Student> aClass2 = student.getClass();
        System.out.println(aClass==aClass1);
        System.out.println(aClass1==aClass2);

    }
}

运行结果
在这里插入图片描述

2.2利用反射获取构造方法

在这里插入图片描述

示例代码

Student类

package com.wangwei.myreflect2;


public class Student {
    public Student(){

    }

    public Student (String name){
        this.name=name;
    }
    private Student(int age){
        this.age=age;
    }

    protected Student(String name,int age){
        this.name=name;
        this.age=age;
    }

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Demo2类

package com.wangwei.myreflect2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 通过反射获取构造方法
 */
public class Demo2 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        //1.获取class字节码文件对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect2.Student");

        //2.获取构造方法
//        Constructor<?>[] constructors = aClass.getConstructors();
//        for (Constructor con:constructors){
//            System.out.println(con);
//        }

//        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
//        for (Constructor con:declaredConstructors){
//            System.out.println(con);
//        }

//        Constructor<?> constructor = aClass.getConstructor();
//        System.out.println(constructor);

        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor);

        declaredConstructor.setAccessible(true);
        Student david = (Student)declaredConstructor.newInstance(18);
        System.out.println(david.getAge());


    }
}

运行结果
在这里插入图片描述

2.3利用反射获取成员变量

获取到成员变量,对成员变量进行赋值和取值操作。
在这里插入图片描述

示例代码

Student类

package com.wangwei.myreflect3;


public class Student {
    public Student(){

    }

    public Student(String name){
        this.name=name;
    }
    private Student(int age){
        this.age=age;
    }

    protected Student(String name, int age){
        this.name=name;
        this.age=age;
    }

    public Student(String name, int age,String gender){
        this.name=name;
        this.age=age;
        this.gender=gender;
    }

    private String name;

    private int age;

    public String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

Demo3类

package com.wangwei.myreflect3;

import java.lang.reflect.Field;

/**
 * 通过反射获取成员变量
 */
public class Demo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取class字节码文件的对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect3.Student");

        //2.获取公共成员变量
//        Field[] fields = aClass.getFields();
//        for(Field field:fields){
//            System.out.println(field);
//        }

        //获取所有成员变量
//        Field[] declaredFields = aClass.getDeclaredFields();
//        for(Field field:declaredFields){
//            System.out.println(field);
//        }

        //获取单个公共的成员变量
        Field gender = aClass.getField("gender");
        System.out.println(gender);

        //获取成员变量的值
        Student student = new Student("David", 18, "男");
        String value = (String)gender.get(student);
        System.out.println(value);

        //修改对象成员变量的值
        gender.set(student,"Daxi");
        String value1 = (String)gender.get(student);
        System.out.println(value1);

    }
}

运行结果
在这里插入图片描述

2.4利用反射获取成员方法

在这里插入图片描述
Student类

package com.wangwei.myreflect4;


public class Student {

    public Student(){

    }

    public Student(String name,int age){

    }
    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    public void sleep(){
        System.out.println("睡觉");
    }

    private void eat(String something){
        System.out.println("吃"+something);
    }
}

Demo4类

package com.wangwei.myreflect4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Demo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取class字节码文件对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect4.Student");

        //2.获取所有公共的方法对象(包含父类中的方法)
//        Method[] methods = aClass.getMethods();
//        for (Method method:methods){
//            System.out.println(method);
//        }

        //获取所有的方法对象(不能回去父类的,但是可以获取本类中私有的方法
//        Method[] declaredMethods = aClass.getDeclaredMethods();
//        for (Method method:declaredMethods){
//            System.out.println(method);
//        }

        //获取具体方法对象
        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        //方法运行
        Student student = new Student();
        eat.setAccessible(true);
        eat.invoke(student, "汉堡");
    }
}

运行结果
在这里插入图片描述

三、总结

  1. 在项目新架构中大量使用了反射,越发能够体会到反射的强大之处,是实现架构底层高复用、高扩展、高维护的实现方式之一。

四、升华

  1. 学习是一个迭代的过程:通过这一次的博客总结,博主对于反射的概念理解以及在宏观的运用上达到了熟练的层次。

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

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

相关文章

Java 乘等赋值运算

下面这个题目是在一公司发过来的&#xff0c;如果你对 Java 的赋值运算比较了解的话&#xff0c;会很快知道答案的。 这个运算符在 Java 里面叫做乘等或者乘和赋值操作符&#xff0c;它把左操作数和右操作数相乘赋值给左操作数。 例如下面的&#xff1a;density * invertedRat…

LeetCode(力扣)236. 二叉树的最近公共祖先Python

LeetCode236. 二叉树的最近公共祖先 题目链接代码 题目链接 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.…

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking&#xff1a;分布式系统的应用程序性能监视工具 作用&#xff1a;分布式追踪、性能指标分析、应用、服务依赖分析&#xff1b; SkayWalking性能剖析&#xff1a; 我操&#xff0c;能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…

企业架构LNMP学习笔记7

PHP介绍&#xff1a; HTML&#xff1a;超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP&#xff1a;超文本预处理器。后端语言开发&#xff0c;页面上需要动态改变修改的&#xff0c;需要连接数据库查询数据&#xff0c;转为html。 主要…

学习笔记230810--vue项目中get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法&#xff0c;发现没有载荷&#xff0c;ip地址也没有带查询字符串&#xff0c;数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名&#xff0c;而get方法对象方式传参的参数名是parmas 解…

解决uView2 SwipeAction滑动单元格,点击按钮不关闭的问题

1、首先找到安装SwipeAction插件的位置&#xff0c;我的安装在一下位置 2.在 u-swipe-action-item.vue 文件内找到buttonClickHandler方法 3.在buttonClickHandler方法内添加代码 this.status close

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时&#xff0c;需要计算两个日期之间相隔的秒数&#xff0c;我在写的时候直接将两个日期进行相减&#xff0c;得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试&#xff0c;得出的结论是&#xff1a;如果日期类型直接相减&#…

Vue3实现可视化拖拽标签小程序

介绍 实现功能&#xff1a;可视化标签拖拽&#xff0c;双击标签可修改标签内容 HTML结构 <div class"box" v-move><div class"header">标签1</div><div dblclick"startEditing" v-if"!isEditing">{{content…

springboot web开发整合Freemarker 模板引擎

目录 Freemarker添加依赖配置文件ymlcontrollerhtml Freemarker 简介&#xff1a; FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉财经图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉财经图书馆

服务器上使用screen和linux的基本操作

配环境的一点小问题 我们尽量是去配置能满足代码的环境&#xff0c;而不要想着修改代码&#xff0c;让代码在我们的环境上跑起来。 服务器远程拷贝文件 scp -P 10001 c1316xxx.xxx.xx.xxx:/home/duj/local/cuda10.2.tar ./将c1316xxx.xxx.xx.xxx:/home/duj/local/cuda10.2.ta…

Elasticsearch 分布式搜索——聚合

1.聚合的种类 聚合常见的有三类&#xff1a; **桶&#xff08;Bucket&#xff09;**聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例…

MOS场效应管

导体三极管中参与导电的有两种极性的载流子&#xff0c;所以也称为双极型三极管。本文将介绍另一种三极管&#xff0c;这种三极管只有一种载流子参与导电&#xff0c;所以也称为单极型三极管&#xff0c;因为这种管子是利用电场效应控制电流的&#xff0c;所以也叫场效应三极管…

HTML5+CSS3+JS小实例:科技感满满的鼠标移动推开粒子特效

实例:科技感满满的鼠标移动推开粒子特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport&qu…

电压放大器在电子测量中的应用有哪些

电压放大器是一种非常常见的电子器件&#xff0c;广泛应用于各种电子测量中。本文将介绍电压放大器在电子测量中的几个主要应用。 电压放大器在传感器测量中扮演着重要的角色。传感器是将环境物理量转变为电信号的设备&#xff0c;如温度传感器、压力传感器、湿度传感器等。然而…

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的&#xff0c;主要在标黄的部分&#xff0c;裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…

mac idea启动没反应 无法启动

遇到的问题如下&#xff1a; 启动idea&#xff0c;没反应 无法启动&#xff0c;不论破解还是别的原因&#xff0c;总之无法启动了 应用程序–找到idea–右击显示包内容–Contents–MacOS–打开idea 弹出框提示如下&#xff1a; 双击这个idea可执行文件 1&#xff09;先查看日志…

小程序中如何给会员卡设置到期时间

通过设置会员卡到期时间&#xff0c;可以有效地管理会员卡的使用周期&#xff0c;提供更好的会员服务体验。下面将介绍一种常见的给会员卡设置到期时间的方法。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要设置到期时间的会员卡。也支持对会员卡按…

pytorch中nn.Conv1d功能介绍

在使用Conv1d函数时&#xff0c;pytorch默认你的数据是一维的&#xff0c;比如一句话“深度学习”可以用一个一维数组 [深, 度, 学, 习] 表示&#xff0c;这个数据就是一维的。图片是二维数据&#xff0c;它有长宽两个维度。 因此在使用 Conv1d 函数时&#xff0c;输入是一个三…