静态代理$动态代理

什么是静态代理?

静态代理就是代理模式,给真实类做了个增强的方法

比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉。。。

就要用到增强方法,就在代理类中给你的方法增强

//静态代理模式public class Progects {/*    @Test

public void dd() {//真实代理      Subject jk=new Real();      //代理对象      Proxy hj=new Proxy();      //调度代理对象(jk)方法增强      hj.setSubject(jk);      hj.add();    }*/

接下来就是

JDK动态代理实现:
    @Test    public void dds() {///JDk动态代理      final   IUserDao jk=new UserDaoimpl();三个参数new出一个代理的实例类加载器,类接口最后一个是接口的实现类        IUserDao poxy=(IUserDao)Proxy.newProxyInstance(jk.getClass().getClassLoader(), jk.getClass().getInterfaces(), new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println("事务已经开启");           调度这个方法里的invoke对象的jk                method.invoke(jk,args);
* @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.

return null;            }        });//最后代理方法当然要开启        poxy.add();        poxy.edit();    }
动态代理的AOP底层实现,有接口自动用的是JDK动态代理


CGLib动态代理
   @Test    public void ddss() {///CGLIb动态代理        final UserService service=new UserService();           //Enhancer对象  有了这个对象就能事项动态代理        Enhancer enhancer=new Enhancer();        //在内存中构建业务类的子类        enhancer.setSuperclass(service.getClass());        enhancer.setCallback(new MethodInterceptor() {

public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {                // 前置的业务逻辑操作                System.out.println("事务已开启");/*                * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.*/                methodProxy.invoke(service,objects);                //invoke调用了对象里的方法                // 调用被代理类的方法,传入参数args,得到返回

// 后置的业务逻辑操作                System.out.println("---结束");                return null;            }        });        UserService proxy=new UserService();        proxy.delete();    }

抽象主题:Subject:接口

目标对象(原始对象):RealSubject(要增强的对象) implements

代理对象:Proxy(植入目标对象) 实现了接口

before code block

business  xxx.invoke()

after code block

动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理

1)JDK  在运行时运行时注入

本质:在内存中构建出接口的实现类

特点:被代理对象,必须有接口

Proxy.newProxyInstance(ClassLoader loader,

Class<?>[] interfaces,

InvocationHandler h)

InvocationHandler调度处理器

public interface InvocationHandler {

}

------------------------Code--------------

final IUSerDao dao=new UserDaoImpl();

import java.lang.reflect.Proxy;

InvocationHandler ih=new InvocationHandler(){

public Object invoke(Object proxy,Method method,Object[] args){

==================前置===================

Object result=method.invoke(dao,args);

==================后置===================

return result;

}

};

IUSerDao proxy=(IUSerDao)Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHanlder){

};

proxy.add();

2)Cglib  底层,注入,编译期已经注入了

本质:在内存中生成被代理类(目标类)的【子类】

特点:可以在没有接口的情况下代理

对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,可以为一个类创建子类,解 题

Enhancer xxx=yyy;

UserDaoImpl proxy=(UserDaoImpl)enhancer.create();

proxy.add();

				
时间: 2024-10-01 00:30:48

静态代理$动态代理的相关文章

java 反射之静态and动态代理

首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强. (2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 .那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻

继承?静态代理?写一个自己的动态代理吧

[ 需求分析 ] 在我们实际开发中常常会遇到这样的问题:记录一个类的方法运行时间,以分析性能.一般我们的做法是先在类的开始记录一个开始时间,然后在类的结束记录一个结束时间,二者相减就可以获取我们想要的结果.但是很多时候这些类已经打了jar包,我们无法直接修改源码,这个时候我们应该怎么办呢? 下文使用Tank的移动需要统计时间.记录日志来模拟需求场景,假定Moveable.Tank类无法修改. interface:Moveable public interface Moveable { publi

JAVA学习篇--静态代理VS动态代理

本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者的区别是什么呢? 2,通过学习动态代理了解到动态代理是一种符合AOP设计思想的技术,那么什么又是AOP? 下面是我对它们的理解! 代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对

静态代理和动态代理

所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题运行详细的业务操作.而代理主题负责其它相关业务的处理. 系统中常常有这样的需求:在某些操作前须要进行验证操作,比方:在加入/删除操作时,先进性用户信息验证,确认该用户是否拥有这些操作的权限.代码例如以下: //UserManager接口: public interface UserManager { public void addUser(String username, String password); public void del

静态代理与动态代理

记得刚接触代理,是在大话设计模式,最近在技术总结和学些java的过程又接触到静态代理和动态代理,尤其是动态代理,在学习AOP时,用到了动态代理,下面我用一些例子来对静态代理和动态代理做个总结. 其实用了代理之后最大的好处就是隐藏了真实类(委托类),这样更加安全,而静态代理和动态代理最大的区别就是,静态代理的代理类是程序员自己写的,在程序运行之前就已经存在的,而动态代理则是在程序运行时动态生成的,而且因为动态代理更加灵活,也常被应用. 首先先用一张UML图来理解一下代理是怎么回事? 其实静态代理就

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理: 代理模式,是常用的设计模式.特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类.以及事后处理消息. 代理类和委托类,存在着关联关系.代理类的对象本身并不真正实现服务,知识通过调用委托类的对象的相关方法. 代理类可以分为两种:静态代理和动态代理. 静态代理: 代理类是由程序员创建,或由工具生成的代码 编译成的.在程序运行前,代理类的 *.class文件已经存在了.直接就可以运行 . 动态代理: 动态代理的代理类.没有直接由

JAVA静态&amp;动态代理

具体场景 为了使代理类和被代理类对第三方有相同的函数,代理类和被代理类一般实现一个公共的interface,该interface定义如下 public interface Calculator { public Integer add(Integer num1, Integer num2); public Integer minus(Integer num1, Integer num2); } 被代理类定义如下 public class CalculatorImpl implements Cal

spring静态代理和动态代理

本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能或相同特征的属性抽象到一个层次分明的类结构体系中.随着软件规范的不断扩大,专业化分工越来越系列,以及OOP应用实践的不断增多,随之也暴露了一些OOP无法很好解决的问题. 现在假设系统中有三段完全相似的代码,这些代码通常会采用"复制"."粘贴"方式来完成,通过这种方式开发

java静态代理与动态代理

原文链接:http://www.orlion.ga/207/ 一.代理模式 代理模式是经常用到的设计模式,代理模式是给指定对象提供代理对象.由代理对象来控制具体对象的引用. 代理模式涉及到的角色: 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实