静态代理

Java代理系列-动态代理热身

妖精的绣舞 提交于 2020-03-02 08:20:32
上一章学习了Java的静态代理,但是我们主要用的是动态代理,在学习动态代理前,先熟悉一下需要的API InvocationHandler Proxy Method InvocationHandler是使用Java动态代理 必须实现(implements)的接口 ,它只有一个方法invoke 可能使用过java反射的朋友们都见过此方法,它是用来调用最终的方法的。 下面贴出Java JDK文档对此方法的详细解释 invoke Object invoke(Object proxy, Method method, Object[] args) throws Throwable 在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。 参数: proxy - 在其上调用方法的代理实例 method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。 args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。 返回: 从代理实例的方法调用返回的值

Java动态代理与CGLIB

北城余情 提交于 2020-03-02 03:07:09
1. 静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的,来看一下代理模式的类图: interface Hosee{ String sayhi(); } class Hoseeimpl implements Hosee{ @Override public String sayhi() { return "Welcome oschina hosee's blog"; } } class HoseeProxy implements Hosee{ Hosee h; public HoseeProxy(Hosee h) { this.h = h; } @Override public String sayhi() { System.out.println("I'm proxy!"); return h.sayhi(); } } public class StaticProxy { public static void main(String[] args) { Hoseeimpl h = new Hoseeimpl(); HoseeProxy hp = new HoseeProxy(h); System.out.println(hp.sayhi()); } } 1.1 静态代理的弊端

JAVA代理模式与动态代理模式

倖福魔咒の 提交于 2020-02-29 05:52:34
1、代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要! 上面这个例子,你就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”! 代理模式JAVA代码示例: //抽象角色:抽象类或接口 interface Business { void doAction(); } //真实角色:真正实现了业务逻辑接口 //代理角色:自己并未实现业务逻辑接口,而是调用真实角色来实现 class BusinessImplProxy implements Business { private BusinessImpl bi; public void doAction() { if (bi==null) { bi = new BusinessImpl(); } doBefore(); bi.doAction(); doAfter(); }