反射..获取spring aop代理类 的目标类方法

死磕Spring之AOP篇 - Spring AOP常见面试题 代理模式是一种结构性设计模式,通过代理类为其他对象提供一种代理以控制对这个对象的访问。AOP 代理是 AOP 框架中 AOP 的实现,主要分为静态代理和动态代理,如下:静态代理:代理类需要实现被代理类所实现的接口,同时持有被代理类的引用,新增处理逻辑,进行拦截处理,不过方法还是由被代理类的引用所执行。静态代理通常需要由开发人员在编译阶段就定义好,不易于维护。常用 OOP 继承和组合相结合AspectJ,在编辑阶段会织入 Java 字节码,且在运行期间会进行增强。 阅读详情

背景:

在项目开发过程中(注:项目用的SpringMvc),有这么一种需求,系统所有的表格查询都有统一的查询接口,通过通用的Controller类组装查询条件以及调用查询接口返回查询数据。

        但是在实际开发中碰到了这么一个问题,由于项目中用到了springaop(spring用到了cglib和proxy两种方式),所有的数据查询实现类都被包装成SpringAop代理类,遍历类的所有方法获取数据查询方法时,总是获取不到。代码如下所示(正常的想法):


gridService = SpringContextHolder.getBean(service);//通过前端传入的对应业务实现类名获取对应查询类

<strong><span style="color:#ff0000;">Method[] methods = gridService.getClass().getMethods();//gridService为数据查询通用接口类</span></strong>

Object param = null;
			
for (Method method : methods) {
				
        Class<? extends Object>[] clazz = method.getParameterTypes();
				
	    if (method.getName().equals("queryItems") && clazz.length == 1) {
					
		if (clazz[0].getName().equals(Object.class.getName())) {
			continue;
		}
					
		param = org.springframework.beans.BeanUtils.instantiateClass(clazz[0]);
					
		break;
        }
}
List datas = gridService.queryItems(param);//datas为查询后的结果

测试结果,param一直为空,也就是说找不到对应查询的方法。是怎么回事呢? 后来跟踪源代码查看,发现gridService为springaop包装的aop代理类(<aop:config>), 修改配置将<aop:config>修改成<aop:config proxy-target-class="true">,即使用cglib动态代理,情况依然。故分析,只能获取代理类的原始类,即如下代码所示:


 <pre name="code" class="java">     /**获取 目标对象
	 * @param proxy 代理对象
	 */
	public static Object getTarget(Object proxy) throws Exception {

		if (!AopUtils.isAopProxy(proxy)) {
			return proxy;//不是代理对象
		}

		if (AopUtils.isJdkDynamicProxy(proxy)) {
			return getJdkDynamicProxyTargetObject(proxy);
		} else { //cglib
			return getCglibProxyTargetObject(proxy);
		}
	}

	/** CGLIBProxy 返回目标类 **/
	private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
		
		Object dynamicAdvisedInterceptor = ReflectionUtils.getFieldValue(proxy, "CGLIB$CALLBACK_0");

		Object target = ((AdvisedSupport) ReflectionUtils.getFieldValue(dynamicAdvisedInterceptor, "advised")).getTargetSource().getTarget();

		return target;
	}

	/** JDKProxy 返回目标类 **/
	private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
		
		InvocationHandler invocationHandler = Proxy.getInvocationHandler(proxy);

		Object target = ((AdvisedSupport) ReflectionUtils.getFieldValue(invocationHandler, "advised")).getTargetSource().getTarget();

		return target;
	}




将Method[] methods = gridService.getClass().getMethods(); 改成

  Method[] methods =getTarget(gridService).getClass().getMethods()

就可以查出来数据了


By: http://jianglanlan.iteye.com/blog/1855223



Java反射在AOP中的核心作用:Spring AOP实现 我们的目的是全面了解Java反射在AOP里的重要作用,特别是Spring AOP是怎么依靠Java反射来实现的。范围包括Java反射和AOP的基础概念、它们之间的关系、Spring AOP利用反射实现的原理、实际代码案例以及未来的发展趋势等。首先我们会介绍一些核心术语和相关概念,接着通过有趣的故事引入Java反射和AOP的概念,解释它们的含义和相互关系,用示意图和流程图展示其原理和架构。然后详细讲解核心算法原理和具体操作步骤,给出数学模型和公式并举例说明。 阅读详情

相关推荐

Spring AOP

面向切面

Mr.xing的博客 6656

AOP代理工具类

/** * Copyright (c) 2005-2012 https://github.com/zhangkaitao * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.sishuok.es.common.spring.utils; import org.aopallia

phantomes的专栏 925

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装)

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装) 写在前面 事先说明,本人不是大佬,我只是在不断探索的途中找到了解决这个问题的方法,之前在网上搜索的时候没有看到相关文章,所以就来简单讲一下。 正文 借着蚂蚁金服小程序大赛开通了支付宝小程序个人开发者,尝试将一个微信小程序的项目移植到支付宝上,支付宝对于用户唯一id的获取比微信要复杂很多,微信...

weixin_43102379的博客 3642

获取代理类的父类(原始类)

自定义注解项目启动加载空指针问题,获取代理类的父类

Rookie_cc的博客 1323

零样本缺陷检测新体验:用AnomalyGPT大模型快速搭建智能质检系统(附Win10适配指南)

本文详细介绍了如何利用AnomalyGPT大模型在Windows 10系统上快速搭建零样本工业缺陷检测系统。通过实战指南,涵盖从环境部署、模型准备到工程化落地的全过程,包括将模型封装为API服务、接入工业相机以及开发可视化监控看板,为制造业智能质检提供了一套高效、低门槛的本地部署解决方案。

weixin_29094775的博客 310

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

Spring AopUtils深度解析:从入门到精通的全方位指南

AopUtils是Spring框架中的一个工具类,主要用于处理AOP(面向切面编程)相关的操作。它提供了一系列静态方法,帮助开发者更方便地处理AOP中的对象、代理以及通知(Advice)等。

m0_51176516的博客 1460

从零搭建Arduino仿真开发环境:SimulIDE与IDE配置全攻略

本文详细介绍了如何从零搭建Arduino仿真开发环境,涵盖SimulIDE与Arduino IDE的配置全流程。通过仿真模拟环境,开发者可以零成本试错,快速验证电路设计和程序逻辑,特别适合初学者和便携开发需求。文章提供了软件安装、环境配置、项目实战及问题排查的完整指南,帮助读者高效掌握Arduino仿真开发技巧。

weixin_29284657的博客 518

java反射在spring ioc和aop中的应用

java 反射在spring ioc和aop中的应用

weixin_47467016的博客 1328

基于java的汉服商城管理系统设计与实现的详细项目实例

本文介绍了一个基于Java的汉服商城管理系统设计与实现项目。该项目采用三层架构设计,包含用户模块、商品管理、订单处理、支付结算等核心功能,支持多角色权限控制和响应式前端界面。 系统创新点包括: 专业化的汉服商品管理,支持多规格属性组合 高并发订单处理机制,确保库存实时同步 个性化智能推荐算法提升用户体验 细粒度权限控制保障系统安全 项目采用SpringBoot+MyBatis技术栈,前端使用React框架实现跨设备兼容。数据库设计包含用户表、商品表、订单表等10个核心表,通过事务管理确保数据一致性。 系统解

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 804

【unity实战】Spline 插件让物体沿路径 “丝滑” 走位,实现火车沿轨道移动——Spline 插件的使用

Unity Spline系统教程:实现火车轨道移动 摘要:本文介绍了Unity Spline系统的核心功能与实战应用,通过火车轨道移动案例演示了完整开发流程。内容包括:1)安装Spline包并绘制样条线轨道;2)调整样条节点和曲线弧度;3)使用Spline Instantiate组件实例化轨道模型;4)通过Spline Animate组件实现小车自动沿轨移动;5)补充讲解了轨道闭合、分支节点、循环模式等进阶技巧。该系统可用于创建河流、摄像机路径等多种曲线应用,文中提供了官方文档链接和详细操作步骤,适合Uni

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1826

Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import javax.persistence.Table; annotation.name() 这里的item是一个Object,如果是class,就会得到得到不一样的,但可以强转得到 这里的a...

IT1995的博客 9240

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 580

获取spring aop代理类指定方法

        背景:本人在项目开发过程中(注:项目用的SpringMvc),有这么一种需求,系统所有的表格查询都有统一的查询接口,通过通用的Controller类组装查询条件以及调用查询接口返回查询数据。         但是在实际开发中碰到了这么一个问题,由于项目中用到了springaop,所有的数据查询实现类都被包装成SpringAop代理类,遍历类的所有方法获取数据查询方法时,总是获...

l903659628的博客 1071

7、Python高光谱分析工具(PyHAT)简介

Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高

aa123的博客 138

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

arthas 获取spring被代理的目标对象

背景 记得一次问题排查,通过ognl 获取到 spring aop 代理过的cglib 代理对象的原始对象获取问题,spring的静态static spring context 进行调用获取被代理的目标对象的问题,记得当事是通过内部的一个工具 代理对象中被代理的目标对象 类似这个方法,通过静态的方法进行调用.挺方便的,但是这个方法比较麻烦,不是所有的工程都有这个方法,如何通过工具化让大家都能使用,这里使用 ognl 表达式进行复原整个过程,方便使用。更多使用参考 Idea Plugin,最近会把这个功能集成

汪小哥 3052

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

阿里P8面试被问:Spring AOP Proxy创建出来的到底是个啥?

/ 获取Callback:包含DynamicAdvisedInterceptor,亦是MethodInterceptor// …// 生成代理对象并创建代理(设置 enhancer 的 callback 值)// …最后一般都会执行到CglibAopProxy子类。

2501_90403933的博客 1788

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring之执行AOP代理类方法的流程

在前面三篇博客中,我们已经详细的讲解了有关AOP的配置文件的解析、bean的实例化,在本篇博客中我们将看到AOP是如何执行的 Dao userDao = (Dao) beanFactory.getBean("userDao"); userDao.save(); 这是本篇展开的两行代码,userDao在创建的时候已经被替代成代理类了,在执行save方法的时候会被拦截被我们的AOP处理,先看一下获取...

m0_37343985的博客 739

spring代理类的属性为什么为null

通过分析前端请求后端private接口方法,发现改私有方法被直接调用,且该方法被调用的对象的属性为null,进而分析导致这样结果的原因和解决的方式

weixin_44790908的博客 1022

Spring AOP是怎么实现的

概述 Spring的AOP实现是通过动态代理实现的。如果我们为Spring的一个bean配置了AOP切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。 而Spring的AOP使用了两种动态代理,分别是 JDK的动态代理; CGLib的动态代理。 JDK动态代理 Spring默认使用JDK的动态代理实现AOP,类如果实现了接口,Spring就会使用这种方式实现动态代理。JDK实现动态代理需要两个组件

张三李四王五老六 5358

深入浅出:Spring AOP 中的 Java 反射

本文通过Spring AOP实现公共字段自动填充的案例,深入解析了Java反射的核心机制。文章展示了如何利用反射在运行时动态获取方法注解信息(如@AutoFill)、操作实体对象属性(createTime、updateUser等字段),实现INSERT/UPDATE操作时的自动填充功能。关键点包括:1)通过MethodSignature获取方法元数据;2)使用Class.getDeclaredMethod()动态获取setter方法;3)通过Method.invoke()执行字段赋值。这种反射与AOP的结合

weixin_50882748的博客 1113

通过spring aop去反射目标类方法参数的注解值

首先我们先配置好spring aop 环境 然后以一个类中的方法为切入点,通过反射机制获得目标方法参数信息下面是我们要反射的类 Z,X都是事先自己写好的注解类@Z(33) public class DukePerformer { @Z(100) private int q; private String name; public void setName(Str

浅扉浅蓝的博客 1612

在spring中获取代理对象代理的目标对象工具类

问题描述 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!! 用托管的spring service类调用getClass...

wjx_jasin的博客 993

Spring boot框架下的Java 反射

Spring容器启动时,会扫描类路径下标注有特定注解(如。

m0_73837751的博客 2471

Spring学习(四)反射、AOP、JUnit

AOP(aspect oriented programming)是一种设计思想,面向切面编程,以预编译和运行期动态代理方式实现。在不修改源代码的情况下,给程序动态统一添加额外功能的一种技术。利用AOP对业务逻辑各部分进行隔离,从而降低耦合,提高程序可重用性,提高开发效率。

bollks的博客 981
上一篇: Spring中的jar
下一篇: spring 中controller间跳转传值
_hug
博客等级 码龄17年 24粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值