资讯专栏INFORMATION COLUMN

Java代理设计模式详解

CoorChice / 412人阅读

摘要:代理即通过代理类,找到适合你的实现类。相当于现实生活中的中介的角色,你想租房子,这个时候你又不想自己找房子,那你可以找中介,通过中介找到合适自己的房子,同时你也可以让中介帮你签合同等其他事宜。

代理即通过代理类,找到适合你的实现类。相当于现实生活中的中介的角色,你想租房子,这个时候你又不想自己找房子,那你可以找中介,通过中介找到合适自己的房子,同时你也可以让中介帮你签合同等其他事宜。代理存在静态代理和动态代理两种

静态代理
public interface Sourceable {  
    public void method();  
}  
public class Source implements Sourceable {  
  
    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}  
public class Proxy implements Sourceable {  
  
    private Source source;  
    public Proxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
      //新增的处理,个性化处理
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}  

测试类

public class ProxyTest {  
  
    public static void main(String[] args) {  
        Sourceable source = new Proxy();  
        source.method();  
    }  
  
}  
动态代理

JDK动态代理、AOP动态代理

Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类

创建动态代理类

static ClassgetProxyClass(ClassLoader loader,Class...interfaces):创建一个动态代理类锁对应的Class对象,该代理类将实现interface所指定的多个接口,第一个ClassLoader 参数指生成动态代理类的类加载器。

创建动态代理对象

static Object newProxyInstance(ClassLoader loader,Class...interfaces,InvocationHadnler h):直接创建一个动态代理对象,该代理对象的实现类实现了interfaces指定的系列接口,执行代理对象的每个方法时都会被替换执行InvocationHadnler对象的invoke方法

public interface Colorable {
     public void value();
}
public class RedColor implements Colorable{
     @Override
        public void value() {
            System.out.println("--------------red-------------");
        }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableProxy implements InvocationHandler {

    private Colorable colorable;
    private Colorable proxy;

    public ColorableProxy(Colorable colorable) {
        this.colorable = colorable;
        this.proxy = (Colorable) Proxy.newProxyInstance(
                Colorable.class.getClassLoader(),
                new Class[] { Colorable.class }, this);
    }

    public Colorable getProxy() {
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        String methodName = method.getName();

        System.out.println("===========starting invoke function:" + methodName
                + "==========");

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

        System.out.println("=========== invoke function:" + methodName
                + " success==========");
        return result;
    }

    public static void main(String[] args) {

        Colorable proxy = new ColorableProxy(new RedColor()).getProxy();
        //真正调用invoke方法是在这一步才被激发的,可以debug试一下
        proxy.value();
    }

}

结果

===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

proxy:代表动态代理对象

method:代表正在执行的方法

args:代表调用目标方法时传入的实参

AOP动态代理

public interface Colorable {
     public void value();
}
public class RedColor implements Colorable{
     @Override
        public void value() {
            System.out.println("--------------red-------------");
        }
}
public class ToolUtility {

    public void method(){
        System.out.println("运行工具方法");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableAOProxy implements InvocationHandler {
    private Colorable colorable;
    private Colorable proxy;

    public ColorableAOProxy(Colorable colorable) {
        this.colorable = colorable;
        this.proxy = (Colorable) Proxy.newProxyInstance(
                Colorable.class.getClassLoader(),
                new Class[] { Colorable.class }, this);
    }

    public Colorable getProxy() {
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        ToolUtility tool = new ToolUtility();
        tool.method();
        String methodName = method.getName();
        System.out.println("===========starting invoke function:" + methodName
                + "==========");
        Object result = method.invoke(colorable, args);

        System.out.println("=========== invoke function:" + methodName
                + " success==========");
        return result;
    }

    public static void main(String[] args) {
        Colorable proxy = new ColorableAOProxy(new RedColor()).getProxy();
        // 真正调用invoke方法是在这一步才被激发的,可以debug试一下
        proxy.value();
    }
}

结果

运行工具方法
===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

更多内容可以关注微信公众号,或者访问AppZone网站

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66009.html

相关文章

  • java retry(重试) spring retry, guava retrying 详解

    摘要:支持重试版本思考小明我手头还有其他任务,这个也挺简单的。与其他类似的字节码编辑器不同,提供了两个级别的源级和字节码级。另一方面,字节码级允许用户直接编辑类文件作为其他编辑器。提供与其他字节码框架类似的功能,但主要关注性能。 系列说明 java retry 的一步步实现机制。 java-retry 源码地址 情景导入 简单的需求 产品经理:实现一个按条件,查询用户信息的服务。 小明:好的...

    LucasTwilight 评论0 收藏0
  • 后端ing

    摘要:当活动线程核心线程非核心线程达到这个数值后,后续任务将会根据来进行拒绝策略处理。线程池工作原则当线程池中线程数量小于则创建线程,并处理请求。当线程池中的数量等于最大线程数时默默丢弃不能执行的新加任务,不报任何异常。 spring-cache使用记录 spring-cache的使用记录,坑点记录以及采用的解决方案 深入分析 java 线程池的实现原理 在这篇文章中,作者有条不紊的将 ja...

    roadtogeek 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0
  • SpringAOP面向切面详解(带实例)

    摘要:了解的相关术语通知通知定义了切面是什么,以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。就是用来配置切面设置代理模式。 了解AOP的相关术语 1.通知(Advice): 通知定义了切面是什么,以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.连接点(Joinpoint): 程序能够应用通知的一个时机,这些时机就是连接点,例如方法被调用时、异常被抛出时等等。 ...

    马忠志 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<