码迷,mamicode.com
首页 > 编程语言 > 详细

java的动态代理设计模式

时间:2015-10-13 22:27:04      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

代码实现:

package com.lky.proxy;

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

public class DynamicProxy implements InvocationHandler {

    private Object obj;//被调用的目标对象

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    /**
    * @Title: invoke
     @param arg0  
     @param arg1  被调用目标对象的方法
     @param arg2  被调用目标对象方法的参数
     @return
     @throws Throwable    参数
    * @return    返回类型
     */
    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
        Object result = null;
        doBefore();
        result = arg1.invoke(obj, arg2);
        doAfter();
        return result;
    }

    //工厂模式生成动态动态代理
    public static Object proxyFactory(Object object) {
        Class<? extends Object> cls = object.getClass();
        return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(object));
    }

    public void doBefore() {
        System.out.println("初始化。。。。。。。。。");
    }

    public void doAfter() {
        System.out.println("日志处理。。。。。。。。。");
    }
}

测试代码:

package com.lky.proxy;

import org.junit.Test;

public class testProxy {
    
    @Test
    public void test(){
        Cat cat=new Cat();
        Animal animal=(Animal)DynamicProxy.proxyFactory(cat);
        animal.eat();
        System.out.println("-------------------");
        animal.sleep();
        System.out.println("-------------------");
        
        Car car=new Car();
        Vehicle vehicle=(Vehicle)DynamicProxy.proxyFactory(car);
        vehicle.run();
        System.out.println("-------------------");
        vehicle.stop();
    }
    
}

注:

  1. 抽象角色(抽象类或接口),真实角色(真正实现了业务逻辑接口),代理角色(自己并未实现业务逻辑接口,而是调用真实角色来实现),这里接口和接口的实现没有列举,只列举了动态代理生成
  2. 一个类要能处理动态代理必须实现InvocationHandler 接口
  3. 动态代理的获取需要Proxy的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来生成
  4. invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用

java的动态代理设计模式

标签:

原文地址:http://www.cnblogs.com/dmir/p/4875981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!