动态代理

java 静态代理 JDK动态代理 Cglib动态代理

Deadly 提交于 2020-02-03 14:07:00
下面以一个简单的银行账户为例讲述讲述动态代理。 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行不认账,客户收到了损失。银行为了避免这种现象再次发生,决定对这个系统进行修改,但是因为bankAccount太过复杂,希望在不修改bankAccount的情况下,增加日志功能。 静态代理 使用静态代理解决上面的问题。 银行要求所有模块都需要添加日志功能,这对苦逼的程序员来说真的是一个不小的工作量啊,这需要写多少个自定义的代理类???还有没有时间可以愉快的玩耍了! 动态代理 Java JDK提供了一种动态代理实现机制,不用为每一个类自己手动去编写一个代理类,它可以帮你自动生成代理类。 下面讲一下,上面用到的几个关键方法和接口: InvocationHandler接口: public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; } 参数说明: Object proxy:动态生成的代理类的实例 Method method:要调用的方法 Object[] args:方法调用时所需要的参数

Spring 动态代理

喜夏-厌秋 提交于 2020-02-03 14:06:14
Spring的动态代理 AOP功能强大,但是spring是如何来实现AOP技术的呢? SPRING是通过动态代理来实现AOP的,SPRING内部提供了2种实现机制 1.如果是有接口声明的类进行AOP,spring调用的是java.lang.reflection.Proxy类来做处理 Java代码 org.springframework.aop.framework.JdkDynamicAopProxy public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { Class targetClass = this .advised.getTargetSource().getTargetClass(); logger.debug( "Creating JDK dynamic proxy" + (targetClass != null ? " for [" + targetClass.getName() + "]" : "" )); } Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces( this .advised); return Proxy.newProxyInstance(classLoader,

cglib动态代理

依然范特西╮ 提交于 2020-02-03 01:51:12
jdk动态代理要求委托类需要实现接口,对于一些不实现任何接口的类可以使用cglib动态代理。 使用cglib动态代理需要导入需要的jar包,Spring Core包中已经集成了cglib所需要的jar包。 1、在项目目录下新建一个文件夹,取名lib 2、向lib中添加jar包 3、右击jar包->Build Path->Add to Build Path //Human类,不实现任何接口 class Human{ public void eat() { System.out.println("吃"); } //创建代理对象 public Human createProxy() { MyInterceptor cp=new MyInterceptor(); //创建动态类对象 Enhancer eh=new Enhancer(); //将需要增强的类设置为其父类 eh.setSuperclass(this.getClass()); //设置代理逻辑对象,即由这个对象(cp)来处理对真实对象方法的调用 eh.setCallback(cp); //返回代理对象 return (Human)eh.create(); } } class MyInterceptor implements MethodInterceptor{ //通过intercept方法完成对真实对象方法的调用

jdk动态代理

南楼画角 提交于 2020-02-02 10:14:21
java实现动态代理所需的类或接口: 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler (Interface)、另一个则是 Proxy (Class),这一个类和接口是实现我们动态代理所必须用到的。 1. InvocationHandler 每一个动态代理类都必须要实现InvocationHandler接口,并且每个代理类的实列都关联了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的的invoker 方法来进行,我们来看看InvocationHandler接口的唯一一个方法invocker方法: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; 这个方法一共接收三个参数,那么这三个参数分别代表如下: proxy:指代JDK动态生成的最终代理对象 method:指代的是我们所要调用真实对象的某个方法的method对象 args:指代的是调用真实对象某个方法时接受的参数。 2.Proxy Proxy这个类的作用就是用来动态创建衣蛾代理对象的类,它提供了许多方法, 但是我们用的最多的就是newProxyInstance这个方法: public

Java 静态代理和动态代理

最后都变了- 提交于 2020-02-02 10:07:29
Java 静态代理 静态代理通常用于对原有业务逻辑的扩充。比如持有二方包的某个类,并调用了其中的某些方法。然后出于某种原因,比如记录日志、打印方法执行时间,但是又不好将这些逻辑写入二方包的方法里。所以可以创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。 这其实也就是代理模式的一种实现,通过对真实对象的封装,来实现扩展性。 一个典型的代理模式通常有三个角色,这里称之为**代理三要素** 共同接口 public interface Action { public void doSomething ( ); } 真实对象 public class RealObject implements Action{ public void doSomething () { System.out.println( "do something"); } } 代理对象 public class Proxy implements Action { private Action realObject; public Proxy (Action realObject) { this.realObject = realObject; } public void doSomething () { System.out.println

JDK动态代理

爷,独闯天下 提交于 2020-02-02 10:03:29
一、基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念。代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念。这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表另外一个人(或文档)。 从这个简明扼要的定义中,可以看出代理的一些特性:1.代理存在的意义就是代表另一个事物。2.代理至少需要完成(或实现)它所代表的事物的功能。 2.什么是JAVA静态代理? JAVA静态代理是指由程序员创建或工具生成的代理类,这个类在编译期就已经是确定了的,存在的。 典型的静态代理模式一般包含三类角色: 1.抽象角色:它的作用是定义一组行为规范。抽象角色一般呈现为接口(或抽象类),这些接口(或抽象类)中定义的方法就是待实现的。 2.真实角色:实现了抽象角色所定义的行为。真实角色就是个普通的类,它需要实现抽象角色定义的那些接口。 3.代理角色:代表真实角色的角色。根据上面代理的定义,我们可以知道代理角色需要至少完成(或实现)真实角色的功能。为了完成这一使命

动态代理jdk和cglib的区别

家住魔仙堡 提交于 2020-02-01 19:08:35
动态代理的描述在前两篇文章已经做了一部分描述 动态代理的详细解读 和 动态代理的简单描述 , JDK的动态代理只能针对实现了接口的类生成代理。而cglib的动态代理是针对类实现代理,这两种代理我们可以灵活使用。 我们通过汽车跑的例子来解读这两种动态代理。 一.JDK动态代理 Car接口 package proxy; public interface Car { public void run(); } Car实现类 package proxy; public class CarImpl implements Car{ public void run() { System.out.println("car running"); } } Car代理类 package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //JDK动态代理代理类 public class CarHandler implements InvocationHandler{ //真实类的对象 private Object car; //构造方法赋值给真实的类 public CarHandler(Object obj){ this.car = obj; } //代理类执行方法时,调用的是这个方法

JDK实现动态代理

帅比萌擦擦* 提交于 2020-02-01 07:51:47
JDK动态代理 实现步骤 实例如下: 用途 实现步骤 约定好接口(自定义名字),实现这个接口的类(自定义名字)设为Client 代理类 ,一定要实现InvocationHandler接口 调用Proxy.newProxyInstance(Client的类加载器,接口列表,绑定的代理类对象)生成proxy实例 可以通过proxy.method()调用接口中约定好的方法 实例如下: public interface ClientInterface { //约定的要被代理的接口 public int add ( Integer a , Integer b ) ; public int subtract ( Integer amount , Integer part ) ; } public class Person implements ClientInterface { //实现了约定的接口的类 @Override public int add ( Integer a , Integer b ) { return ( a + b ) ; } @Override public int subtract ( Integer amount , Integer part ) { return ( amount - part ) ; } } public class Agency

JAVA 动态代理之jdk动态代理

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-01 06:18:28
前言 jdk动态代理被代理类必须是接口类 创建接口UserDao public interface UserDao { void save ( ) ; void find ( ) ; } 创建接口实现类UserDaoImpl public class UserDaoImpl implements UserDao { public void save ( ) { System . out . println ( "保存数据成功" ) ; } public void find ( ) { System . out . println ( "获取数据成功" ) ; } } 创建jdk动态代理类 /** * 动态代理实现类 */ public class ProxyFactory { private Object target = null ; public ProxyFactory ( Object target ) { this . target = target ; } public Object getNewInstance ( ) { Object proxy = Proxy . newProxyInstance ( target . getClass ( ) . getClassLoader ( ) , target . getClass ( ) . getInterfaces

Day23——动态代理

自闭症网瘾萝莉.ら 提交于 2020-01-31 13:16:06
一. 回顾 前面 Day22——AOP前奏 讲到了计算器的日志功能问题,由于代码散乱,需要将日志功能独立出来实现,需要用到动态代理。今天讲述动态代理。 本文章项目源码已上传到本博客的“资源”,可自行前往免费下载 二. 原理 2.1 动态代理的原理 代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象“取代”原始对象,任何原始对象的调用都需要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 动态代理原理: 在运行时,动态地给原始对象(即目标对象)生成一个代理对象,代理对象可以增强原始对象的功能(即扩展功能),代理对象只能完成扩展出来的功能,而原始对象的功能还必须由原始对象去完成。但是,代理对象决定是否以及何时将功能转回到原始对象上。 2.2 JDK动态代理 Proxy:所有动态代理的父类。主要用于生成代理类,代理对象。 //返回代理类的Class对象 public static Class < ? > getProxyClass ( Classloader loader , Class < ? > . . . interface ) ; //返回代理对象 public static Object newProxyInstance ( Classloader loader , Class < ? > [ ] . . . interface ,