spring6.1在java17环境下使用反射

news/2024/12/25 13:45:55/文章来源:https://www.cnblogs.com/weiyanei/p/18424573

引包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>3.3.4</version>
</dependency>

反射代码

  编写简单的反射方法,如下所示

package com.lw.reflect.cglib;import com.lw.reflect.UserServiceImpl;
import org.springframework.cglib.proxy.*;import java.lang.reflect.Method;public class SpringCglibProxyUtil {public static void main(String[] args) {// 创建Enhancer对象Enhancer enhancer = new Enhancer();// 设置Enhancer对象的父类enhancer.setSuperclass(UserServiceImpl.class);// 设置回调方法enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method: " + method.getName());// 调用父类(被代理对象)的方法Object result = proxy.invokeSuper(obj, args);System.out.println("After method: " + method.getName());return result;}}, NoOp.INSTANCE});enhancer.setCallbackFilter(method -> {if(method.getDeclaringClass().isAssignableFrom(Object.class)){return 0;//使用NoOp.INSTANCE}return 0;});// 创建代理对象UserServiceImpl proxyInstance = (UserServiceImpl) enhancer.create();// 调用代理对象的方法proxyInstance.showInfo();}
}

增加module-info.java

module JavaSEBase {requires spring.core;requires spring.aop;opens com.lw.reflect to spring.core;
}

报错

  如果仅仅是上面配置,那么会报错,报错是 module JavaSEBase does not open com.lw.reflect to module spring.core

  这是java9引入了模块化导致的,所以需要在启动时在VM options加入如下配置,

 

  如果是其他unnamed模块使用,用如下配置,

--add-opens
java.base/java.lang=ALL-UNNAMED
--add-opens
java.base/java.lang.reflect=ALL-UNNAMED

  如果要打包,就在pom.xml中增加如下配置,

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0</version><configuration><argLine>--add-opens=java.base/java.lang=ALL-UNNAMED--add-opens=java.base/java.lang.reflect=ALL-UNNAMED</argLine></configuration></plugin></plugins>
</build>

cglib使用

  如果是cglib的使用,这玩意5年前就没更新了,对java9的模块化是不支持的,我搞不懂spring6.1了怎么还对java9不支持,还要添加--add-opens启动选项。

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>

   module-info.java中修改如下,

module JavaSEBase {requires cglib;requires spring.core;requires spring.aop;opens com.lw.reflect to spring.core,cglib;
}

  测试代码如下,

package com.lw.reflect.cglib;import com.lw.reflect.UserServiceImpl;
import net.sf.cglib.proxy.*;import java.lang.reflect.Method;public class OriginCglibProxyUtil {public static void main(String[] args) {// 创建Enhancer对象Enhancer enhancer = new Enhancer();// 设置Enhancer对象的父类enhancer.setSuperclass(UserServiceImpl.class);// 设置回调方法enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method: " + method.getName());// 调用父类(被代理对象)的方法Object result = proxy.invokeSuper(obj, args);System.out.println("After method: " + method.getName());return result;}});// 创建代理对象UserServiceImpl proxyInstance = (UserServiceImpl) enhancer.create();// 调用代理对象的方法proxyInstance.showInfo();}
}

  启动配置项: --add-opens java.base/java.lang=cglib

工程结构

java9引入了module,确实在权限控制上更细了,但因此引入的问题也更多,特别是module-info.java这个文件。

 

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

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

相关文章

实景三维+耕地保护:构建耕地资源管理的全闭环新模式

在耕地资源日益珍贵的今天,如何高效、精准地实施耕地保护,成为了我国农业可持续发展与生态文明建设的关键课题。“实景三维+耕地保护”的创新模式,能够为这一挑战提供突破性的解决方案,打造一个从前端监测到后端管理的全闭环耕地保护管理模式。本文将深入分析这一模式的核心…

IDEA 如何设置TAB页显示多行

前言 我们在使用IDEA开发时,经常需要打开多个TAB页,但是,IDEA默认的方式是最多只能打开少量的TAB页,且打开的TAB页只能堆积在一行上显示,如果超出了数量,就会自动隐藏。这样对于我能经常需要在多个不同TAB页之间打开来说,是比较麻烦的,那么有什么办法能改变下设置呢? …

深入剖析RocketMQ消息消费原理

本文参考转载至《RocketMQ技术内幕 第2版》一. 消息消费概述 消息消费以组的模式开展,一个消费组可以包含多个消费者,每个消费组可以订阅多个主题,消费组之间有集群模式和广播模式两种消费模式。集群模式是当前主题下的同一条消息只允许被其中一个消费者消费。广播模式是当前…

dc-8

靶机下载地址:dc-8 找到靶机 nmap -sV 192.168.6.0/24查看端口 疑似有注入点开始尝试 python sqlmap.py -u "http://192.168.6.135/?nid=*" --dbs 查库python sqlmap.py -u "http://192.168.6.135/?nid=*" -D "d7db" --tables 查表python sqlm…

27. 守护进程、进程间通信

1. 僵尸进程与孤儿进程1.1 前言 在unix中,所有的子进程都是由父进程创建的,子进程再创建新的子进程 子进程的结束和父进程的运行是一个异步的过程,即子进程运行完成时,父进程并不知道 当子进程运行完成时,父进程需要调用wait()或waitpid()来获取子进程的运行状态 1.2 僵尸…

BUU XSS COURSE 1

启动靶机有留言板和登录功能,很明显是存储性xss,通过留言功能插入xss代码,获取cookie登录后台 先测试过滤 <script>alert(1);</script> 查看源代码发现script被过滤 <input onfocus="alert(xss);">好像只过滤了script找一个xss平台或者自己用服…

Wireshark开源抓包工具

Wireshark零基础使用教程(超详细) - 元宇宙-Metaverse - 博客园 (cnblogs.com)一、Wireshark是什么 Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。 它使用WinPCAP作为接口,直接与网卡进行数据报文交换。 二、Wiresha…

Prompt提示词概念

什么是prompt提示词? 叮!快来看看我和文心一言的奇妙对话~什么是提示工程(prompt engineering)?点击链接 https://yiyan.baidu.com/share/vMZ69XCFTc?utm_invite_code=P0HSh4T14mrU4TwxGbJ%2BSw%3D%3D&utm_name=SGlkZGVuX3N0YXJz&utm_fission_type=common -- 文心…

C#|.net core 基础 - 深拷贝的五大类N种实现方式

C#深拷贝复杂,文中介绍了五大类N种深拷贝方法,包括简单引用类型、手动方式、序列化方式、第三方库方式和扩展视野方式,并对比了性能。建议使用AutoMapper和DeepCloner等成熟库或根据性能需求选择表达式树和Emit。在实际应用中经常会有这样的需求:获取一个与原对象数据相同但…

智能写作新体验:AI写作小助手助力内容创作

在信息时代的浪潮中,内容创作已成为连接世界、传递价值的重要桥梁。然而,传统的写作方式在效率和质量上往往难以满足现代社会的需求。此时,AI写作小助手的诞生,为内容创作带来了全新的体验。本文将深入探讨AI写作小助手如何助力内容创作,开启智能写作的新篇章。AI写作小助…

基于Vue实现动态组织结构图

最近一个项目里有个前端绘制家谱图的需求,大概是下面这个样子:组件源码如下<template><table v-if="treeData.name"><tr><td :colspan="Array.isArray(treeData.children) ? treeData.children.length * 2 : 1":class="{pare…

中国能源发展报告2022

中国能源发展与未来中国能源发展报告2022林伯强高耗能产业的出路CCUS(Carbon Capture,Utilization and Storage,即碳捕获、利用与封存技术)高耗能产业布局:08 年,东高西低 >> 08 年之后,西高东低,自南向北移动,东减西增; 转移趋势北部沿海城市-河北,山东,201…