JDK动态代理

JDK动态代理和CGLIB动态代理 在SpringAOP中基于动态代理实现功能的增强,也就是动态的生成代理类,在代理类中织入增强的逻辑然后调用目标对象的方法。动态代理中用的比较多的两种:JDK动态代理、CGLIB动态代理。 JDK动态代理 使用JDK的java.lang.reflect.Proxy类的newProxyInstance方法实现的代理。 用一个测试接口看下具体实现: public interface JdkProxyDemoService { void queryTrs(); } @Service public 阅读详情

http://rejoy.iteye.com/blog/1627405

这篇文章说的够详细了。但是对照传智播客那个视频,貌似有点问题。

return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   
                target.getClass().getInterfaces(), this); 

上面的类加载器,视频中推荐是用目标对象的类加载器。

return Proxy.newProxyInstance(target.getClass.getClassLoader().getContextClassLoader(),   
                target.getClass().getInterfaces(), this); 

还有,把那个代理类改个名字好点,改成某某工厂类,不然听着怪难受的。

package dynamic.proxy;   
  
import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
  
/** 
 * 实现自己的InvocationHandler 
 * @author zyb 
 * @since 2012-8-9 
 * 
 */  
public class MyInvocationHandler implements InvocationHandler {  
      
    // 目标对象   
    private Object target;  
      
    /** 
     * 构造方法 
     * @param target 目标对象  
     */  
    public MyInvocationHandler(Object target) {  
        super();  
        this.target = target;  
    }  
  
  
    /** 
     * 执行目标对象的方法 
     */  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
          
        // 在目标对象的方法执行之前简单的打印一下  
        System.out.println("------------------before------------------");  
          
        // 执行目标对象的方法  
        Object result = method.invoke(target, args);  
          
        // 在目标对象的方法执行之后简单的打印一下  
        System.out.println("-------------------after------------------");  
          
        return result;  
    }  
  
    /** 
     * 获取目标对象的代理对象 
     * @return 代理对象 
     */  
    public Object getProxy() {  
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   
                target.getClass().getInterfaces(), this);  
    }  
} 

改成:

package cn.itcast.service.impl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;



/**
 * @author Administrator
 * JDK动态代理工厂。根据目标对象生成代理对象
 */
public class JDKProxyFactory implements InvocationHandler{
	//要代理的对象
	private Object targetObject;
	//负责生成代理对象的工厂方法
	public Object createProxyObject(Object object){
		//生成PersonServiceBean的代理对象
		this.targetObject = object;
		Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
		return null;
	}
	//代理对象,在获知要调用目标对象的方法时,会回调该方法。在该方法中,代理对象要把对目标对象的操作,委派目标对象执行。
	/*
	 * 有一台打印机(目标对象)实现3C标准(接口,没有质量保证,谁敢用),具有打印功能(方法)。
	 * 有一个会操作打印机的人(代理对象),店主。
	 * 现在有人来打印,就叫店主帮他打印。店主知道了客人要求要打印(请求)
	 * 可是店主自己本身不能打印啊(会打印还得了),核对一下打印的文件(打印前),
	 * 只能给打印机输入打印指令和参数,让他进行打印(委派目标对象进行处理),收集文件(打印后)
	 * 
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result ;
		// TODO Auto-generated method stub
		System.out.println("目标对象执行方法前");
		result = method.invoke(targetObject, args);
		System.out.println("目标对象执行方法后");
		return result;
	}
}
测试代码:

package junit.test;

import static org.junit.Assert.*;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.service.PersonService;
import cn.itcast.service.impl.JDKProxyFactory;
import cn.itcast.service.impl.PersonServiceBean;

public class SpringTest {

	@Test
	public void jdkProxyTest(){
		ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
		PersonService bean = (PersonServiceBean)ctx.getBean("personService1");
		//这里就不同过容器进行创建PersonService了
		JDKProxyFactory jf = new JDKProxyFactory();
		//因为代理对象实现了目标对象的所有接口,所以也可以生产的代理对象也是可以赋值给PersonSercvice
		PersonService personService2 = (PersonService) jf.createProxyObject(bean);
		personService2.save();
	}
}



jdk动态代理实现原理 JDK 动态代理是什么 在了解JDK动态代理前,有需要可以了解下代理模式 参考:https://blog.youkuaiyun.com/yhl_jxy/article/details/52679882 JDK 的动态代理是基于拦截器和反射来实现的 JDK代理是不需要第三方库支持的,只需要 JDK 环境就可以进行代理,使用条件: 必须实现 InvocationHandler 接口 使用 Proxy.newProxyInstance 产生代理对象 被代理的对象必须要实现接口 JDK 动态代理简单实现 使用 JDK 动态 阅读详情

相关推荐

JDK 动态代理

定义目标接口(如)和目标类(如编写InvocationHandler 实现类:在invoke()中写增强逻辑 + 调用目标方法通过生成代理对象调用代理对象的方法:自动触发invoke(),完成增强 + 业务执行通过 JDK 动态代理,我们彻底告别了静态代理的冗余代码,实现了 “一次编写增强逻辑,处处复用” 的优雅效果。这也是 Spring AOP 等框架的核心底层技术之一,掌握它能帮你更深入理解框架的设计思想。

ysct_999的博客 4540

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6385

jdk动态代理和cglib动态代理对比

JDK 动态代理:只代理接口(interface),无法代理类。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。 CGLIB 动态代理:可以代理类和接口。它通过生成目标类的子类来创建代理对象,因此可以代理没有实现接口的类。

zfj321的博客 1544

Java中的JDK动态代理

Java中JDK动态代理,AOP是对动态代理的进一步规范化,CGLB动态代理

weixin_44362089的博客 5562

Yakit实战:利用验证码识别插件突破Webfuzzer自动化测试瓶颈

本文详细介绍了如何利用Yakit的Webfuzzer模块结合验证码识别插件,突破自动化安全测试中的验证码瓶颈。通过实战演示,讲解了如何部署本地OCR服务、编写热加载脚本,实现从获取验证码到自动识别并替换的全流程自动化,从而让Webfuzzer能够高效、无人值守地进行大规模密码喷洒等测试。

weixin_29323493的博客 283

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

JDK动态代理和CGLIB动态代理有什么区别?

JDK动态代理和CGLIB动态代理有什么区别?

水w的博客 8019

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络,自然离不开网络准入(NAC),这就涉及到交换机的一些安全测试,于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击,那么下面提到的各种攻击方式,自然是建立在交换机安全配置之上来说的。我们通过h3c官方提供的《H3C 交换机安全加固手册》和《安全配置指导》,从这两份手册可以看出交换机支持的安全配置非常多,基本已经覆盖了各种我们熟知局域网攻击。下面就挑几个典型的攻击方式进行演示。 arp欺骗 【一>所有资源获取&lt

kali_Ma的博客 1万+

Java——JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

m0_73671382的博客 7677

使用AI编写测试用例——详细教程

现阶段AI还不能完全替代人工测试用例编写,但如果把AI当做一个提高效率的工具,它将会是一个很强大的辅助。

公众号|软件测试老吴 3万+

AD22等长布线规则

本文介绍了PCB布线中实现信号线等长的详细操作步骤:1.创建网络类(NetClass),将需要等长的信号线归入同一组;2.设置高速布线规则(High-SpeedRule),定义等长容差等参数;3.进行交互式等长布线(InteractiveLengthTuning),使用蛇形线调整线长;4.实时调整与最终检查,确保所有网络满足等长要求。文中还提供了实用技巧,如使用快捷键调整蛇形线参数、为关键信号设置更严格规则等。操作需在PCB设计软件中完成,通过统一管理、规则设置和精确调整来实现信号同步传输。

whm128的博客 1557

JDK动态代理详解

可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的Spring中的注解,其依赖于AOP,而AOP的底层实现便是动态代理,看到这里,是不是更有兴趣去了解动态代理了呢?动态代理:可以分解为“动态”+“代理”。所以,静态代理存在一定的局限性,不能很好的满足需求的千变万化,动态代理的出现,就是为了解决这些局限性。

StoNENee的博客 4729

PyTorch 面试题及详细答案120题(54-70)-- 模型训练与评估

本文介绍了PyTorch模型训练的基本流程和核心概念。主要内容包括: 模型训练基本流程:通过代码示例展示了数据准备、模型定义、损失函数和优化器选择、训练循环(前向传播、反向传播、参数更新)的完整过程,并包含验证集评估的实现。 训练过程中的关键概念: Epoch:完整遍历一次训练集 Batch:将数据分成小批次 Iteration:一个Batch的参数更新过程 三者关系:1 Epoch = N/B Batch = N/B Iteration(N为样本数,B为batch_size) PyTorch数据加载机制:

大剑师兰特的GIS世界 489

深入理解JDK动态代理

深入理解JDK动态代理

abcafdsgr123456789的博客 1835

把慢点掰开看:在 SAP HANA 中启用 SQL 优化耗时跟踪 SqlOptTime 的实战指南

摘要:SAP HANA 性能排查中,常出现SQL查询时快时慢的现象,表面看似执行问题,实则是编译阶段耗时过长。通过SQL优化跟踪工具SqlOptStep和SqlOptTime,可精准区分编译与执行时间。SqlOptStep展示优化树变化过程,而SqlOptTime则记录各阶段耗时,帮助定位问题根源。启用SqlOptTime需配置traceprofile,建议限定特定用户以减少系统负载。实际案例显示,报表响应慢常由计算视图编译(CeQo)导致,而非执行阶段问题。解决方案包括调整计算视图展开方式或优化基础视图结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1010

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

简单实现jdk的动态代理

简单实现jdk的动态代理 jdk动态代理的使用 package com.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Test { //产生代理对象 public static ...

小王同学的博客 2070

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JDK动态代理源码解析

本篇从源码的角度,对JDK动态代理的实现,工作原理做简要分析。

西岭千秋雪的博客 1692

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JDK动态代理理解

代理模式说是一种“结构性设计模式” ,其核心思想是通过一个代理对象(proxy)间接访问目标对象(target),从而在不修改对象的前提下,实现对目标对象的控制或者功能增强。抽象角色: 定义目标对象和代理对象的共同接口(如java的接口)真实角色:实现抽象接口的具体业务逻辑类代理对象:持有真实角色的引用,并在其基础上拓展功能(如日志,事务等)举个例子:假设需要租房的时候,租客并不志杰联系房东,而是联系中介。

m0_60963435的博客 1834

SpringAOP JDK动态代理

目前我本人正在学习SpringFramework的知识,这也是这个专栏的主题。我前面的几篇博文中,简单的认识了一下SpringFramework,记录了SpringFramework的环境搭建,记录了SpringIOC如何加载配置文件,记录了SpringIOC三种Bean对象的实例化方法。还记录了SpringIOC手动装配(注入)的方法之一:set方法注入。还有另外三个不太常用的SpringIOC手动注入的方法。其实目前大部分都使用的是自动注入的方法,手动注入使用的不多。就算是使用手动注入的方法,使用的主流

weixin_46281472的博客 3303

深入解析JDK动态代理

JDK动态代理是一种运行时创建代理类的技术,可以在不修改原始类代码的情况下为其添加新的功能。与静态代理不同,JDK动态代理不需要在编译时创建代理类,而是通过反射在运行时生成代理类。首先,我们定义一个接口,这个接口将由代理类实现。JDK动态代理是Java开发中一个非常有用的工具,可以在运行时为对象添加额外的功能,而无需修改原始代码。它主要通过Proxy类和InvocationHandler接口实现,具有很高的灵活性和扩展性。

qq_44266019的博客 1905
上一篇: 框架整合--更新中---
下一篇: CGLib动态代理
_yunfei
博客等级 码龄15年 0粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值