代码实现:

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的动态代理设计模式的更多相关文章

  1. java之动态代理设计模式

    代理:专门完成代理请求的操作类,是所有动态代理类的父类,通过此类为一个或多个接口动态地生成实现类. 弄清动态代理的关键是清楚java的反射机制,在https://www.cnblogs.com/xix ...

  2. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  3. [转载] java的动态代理机制详解

    转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...

  4. java--动态代理设计模式,CGLIB实现的动态代理设计模式

    代理设计模式 代理设计模式的基本形式 代理设计模式的核心思路,一个接口两个子类,一个子类完成核心业务操作,另一个完成与核心业务有关的辅助性操作.例如,编写一个简单的设计模式. package com. ...

  5. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  6. Java特性-动态代理

    代理在开发中无处不在: 我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name).我现在想把每次调用某个实现类的 ...

  7. java的动态代理机制

    前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...

  8. java中动态代理

    一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...

  9. Java的动态代理机制详解(转)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

随机推荐

  1. 单页面应用SPA架构

    个人认为单页面应用的优势相当明显: 前后端职责分离,架构清晰:前端进行交互逻辑,后端负责数据处理. 前后端单独开发.单独测试. 良好的交互体验,前端进行的是局部渲染.避免了不必要的跳转和重复渲染. 当 ...

  2. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  3. apktool的下载地址

    googlecode将要关闭,代码转移到以下网址 http://ibotpeaches.github.io/Apktool/

  4. UVA 12378 Ball Blasting Game 【Manacher回文串】

    Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of differe ...

  5. https大势已来?看腾讯专家如何在高并发压测中支持https

    WeTest 导读 用epoll编写一个高并发网络程序是很常见的任务,但在epoll中加入ssl层的支持则是一个不常见的场景.腾讯WeTest服务器压力测产品,在用户反馈中收到了不少支持https协议 ...

  6. Eclipse自动提示功能

    一般默认情况下,Eclipse的代码提示功能是比MicrosoftVisualStudio的差很多的,主要是Eclipse本身有很多选项是默认关闭的,要开发者自己去手动配置.如果开发者不清楚的话,就不 ...

  7. C++拾遗(八)类——概念、定义与实现

    Class与Struct 区别在于class默认访问类型是private,struct默认访问类型是public. 另外在使用习惯上,struct只用来表示纯粹的数据对象或没有私有部分的类. 类中的内 ...

  8. Java集合类笔试题

    介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...

  9. JS-商品图片点击轮换

    //小图预览区域图片轮换键const LIWIDTH=62;var moveCount=0;document.getElementById("btForward").onclick ...

  10. v9站点自定义变量

    打开 \phpcms\modules\admin\templates\site_edit.tpl.php 文件,找到最后一个 </fieldset> ,在他后面添加一下代码:<!-- ...