首页 > 编程语言 >spring6.1在java17环境下使用反射

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

时间:2024-09-21 21:50:21浏览次数:7  
标签:enhancer 反射 java17 java spring6.1 Object reflect cglib method

引包

<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() {
            @Override
            public 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 java.base does not open java.lang 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() {
            @Override
            public 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这个文件。

 

标签:enhancer,反射,java17,java,spring6.1,Object,reflect,cglib,method
From: https://www.cnblogs.com/weiyanei/p/18424573

相关文章

  • javassisit提升反射效率
    Javassist简介Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学系的ShigeruChiba所创建的。它已加入了开放源代码JBoss应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。Javassist(JAVA编程ASSISTant......
  • 反射相关API
    反射的作用在不修改源码的情况下,扩展功能。程序在运行的时期,通过反射机制,获取类的所有内部信息,并且操作类的对象。Class类一个类在堆中只有一个Class对象,这个Class对象包含了类的完整结构信息反射技术是针对Class对象进行操作,在程序运行的时候,动态获取类中的所有成员[1......
  • Java反射概述
    反射Java反射(Reflection)是一种允许程序在运行时动态地获取有关类、方法和属性的信息,甚至可以对它们进行操作的机制。通过反射,程序可以在编译时并不知道一个类的具体信息的情况下,运行时获取该类的结构,并进行相应的操作。反射的核心是在运行时操作类和对象的元信息,这为开发提......
  • JAVA进阶-枚举,类加载器,反射
    day15-枚举,类加载器,反射枚举为什么有枚举为了简洁的表示一些固定的值,Java就给我们提供了枚举。定义格式是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。格式publicenums{ 枚举项1,枚举项2,枚枚举项3;}定义枚举类要用关键字enum定义......
  • Kali下安装与使用BeEF:反射型与存储型XSS攻击、Cookie会话劫持、键盘监听及浏览器操控
    早八人,护网在即,该学习了~前言BEEFXSS(BrowserExploitationFrameworkXSS),更常见的称呼是BeEF(TheBrowserExploitationFramework),是一个开源的浏览器漏洞利用框架。它由MichałZalewski于2006年创建,旨在帮助渗透测试人员评估Web浏览器的安全性,发现并利用其中的漏洞。xss基......
  • 十、耕耘Java(反射)
    十.耕耘Java(反射)1.概念:程序在运行过程中,1.对于给定的一个类(Class)对象。可以获取到这个类(Class)对象的所有的属性和方法2.对于给定的一个对象(newXXXClassName<?extendobject>),都能够动态类的调用它任意一个属性和方法的机制,就叫做Java的反射机制。反射的优缺点:优点:1......
  • java 反射创建内部类
    Java反射创建内部类在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时检查或修改类的行为。内部类(InnerClass)则是一种特殊的类,它定义在另一个类的内部,并可以访问外部类的成员。本文将深入探讨如何使用Java反射来创建内部类的实例,并展示其在实际开发中的应用。内部类的基......
  • ObjectFactory2反射
    packagecom.shrimpking.t6;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1218:06*/publicclassPerson{privateStringname;publicPerson(){this("匿名构造");}publicPerson(Stringnam......
  • 【JavaSE系列】反射机制
    目录前言一、概述二、获取Class对象三、反射构造方法1.获取构造方法2.获取修饰符、名称和形参3.创建对象四、反射成员变量 1.获取成员变量2.获取修饰符、名称和类型3.赋值/获取值五、反射成员方法1.获取成员方法2.获取修饰符、形参、返回值和异常3.......
  • 反射&动态代理
    1.反射1.1反射的概述:**专业的解释(了解一下):**是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。**通俗的理解:(掌握)**......