54_55总结分析动态代理类的设计原理与结构

log()是系统日志,可以利用切面编程将他模块化,热插拔的插入到invoke方法周围

 

 

 

 

 

 

针对之前的代码,应该抽取黄色部分出来,并模块化

 

 

 

 

目标抽取成为一个参数

final ArrayList target=new ArrayList();
Collection proxy3 = (Collection) getProxy(target,new MyAdvice());

 

系统功能抽取成一个对象

public static Object getProxy(final Object target,final Advice advice) {
    Object proxy3 = Proxy.newProxyInstance(
            Collection.class.getClassLoader(),
            new Class[]{Collection.class},
            new InvocationHandler(){
                @Override
                public Object invoke(Object proxy, Method method,
                        Object[] args) throws Throwable {
                    advice.beforeMethod(method);
                    Object reVal=method.invoke(target, args);
                    advice.afterMethod(method);
                    return reVal;
                }
            }
        );
    return proxy3;
}

 

通知接口--契约

package com.itcast.day3;

import java.lang.reflect.Method;

public interface Advice {
    public void beforeMethod(Method method);
    public void afterMethod(Method method);
}

 

契约的实现--通常是上班时使用Spring aop 时,工作量最大的工作

package com.itcast.day3;

import java.lang.reflect.Method;

public class MyAdvice implements Advice {
    long beginTime=0;
    @Override
    public void beforeMethod(Method method) {
        beginTime=System.currentTimeMillis();
    }

    @Override
    public void afterMethod(Method method) {
        long endTime=System.currentTimeMillis();
        System.out.println(method.getName()+" running "+(endTime-beginTime));
    }
}

使用spring的aop时,只需干两件事

1 配置Advice

2 配置 target

时间: 2024-12-29 09:50:04

54_55总结分析动态代理类的设计原理与结构的相关文章

Java中的静态代理、通用动态代理类以及原理剖析

代理模式和静态代理 在开发中,代理模式是常用的模式之一,一般来说我们使用的代理模式基本上都是静态代理,实现模式大致如下 : 我们以网络代理为例,简单演示一下静态代理的实现 : // 网络接口 interface Network { public void surfTheInternet(); public void gotoFacebook(); } // 普通网络 class CommonNetwork implements Network { @Override public void su

动态代理类

动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(Object obj,Method method, Object[] args)在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组. 这个抽象方法在代理类中动态实现.(2)Proxy:该类即

C#使用Emit构造拦截器动态代理类

在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 public class Interceptor 2 { 3 public object Invoke(object @object, string @method, object[] parameters) 4 { 5 Console.WriteLine( 6 string.Format("Int

Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

JDK动态代理的实现及原理 作者:二青 邮箱:[email protected]     微博:http://weibo.com/xtfggef 动态代理,听上去很高大上的技术,在Java里应用广泛,尤其是在Hibernate和Spring这两种框架里,在AOP,权限控制,事务管理等方面都有动态代理的实现.JDK本身有实现动态代理技术,但是略有限制,即被代理的类必须实现某个接口,否则无法使用JDK自带的动态代理,因此,如果不满足条件,就只能使用另一种更加灵活,功能更加强大的动态代理技术-- CG

动态代理是基于什么原理(总结杨晓峰的博客)

动态代理的原理 编程语言分为:动态类型,静态类型 动态类型和静态类型的区别? 一种比较简单的区别方法:是在编译期进行检查,还是在运行时期进行检查. 通常认为:java是一种强类型语言,但是提供类似反射的机制,也具备部分动态语言的能力. 反射机制是java语言提供的一种基础功能,赋予程序在运行时自省(introspect能力),通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性或者方法,调用方法或者构造对象,甚至可以运行时修改类定义. 动态代理是一种方便运行时动态构建代

alljoyn:基于java动态代理的RPC实现原理分析

alljoyn是由高通开源,allseen组织下,作为IOT的一个开源软件框架. 本文分析它的core部分的远程调用方法的实现过程. 以android core sdk的release版本中的simple程序为例子. (eg alljoyn-14.06.00a-android-sdk-rel\alljoyn-android\core\alljoyn-14.06.00a-rel\java\samples\simple\client) 1. 下面是一个定义为alljoyn接口,并定义了一个远程调用方

MyBatis 源码分析——动态代理

MyBatis框架是如何去执行SQL语句?相信不只是你们,笔者也想要知道是如何进行的.相信有上一章的引导大家都知道SqlSession接口的作用.当然默认情况下还是使用DefaultSqlSession类.关于SqlSession接口的用法有很多种.笔者还是比较喜欢用getMapper方法.对于getMapper方法的实现方式.笔者不能下一个定论.笔者只是想表示一下自己的理解而以--动态代理. 笔者把关于getMapper方法的实现方式理解为动态代理.事实上笔者还想说他可以是一个AOP思想的实现

模拟JDK动态代理类的实现

问题: 要理解动态代理及其优点,我们先从这样一个问题入手,比如现在我们有UserDao这样一个接口,里面有addUser()方法,同时有一个UserDaoImpl类实现了该接口,具体实现了addUser()方法,现在我要实现在该方法前后记录日志的功能,有什么解决办法呢? 在源代码上直接修改.第一反应肯定是直接在源码上添加该功能,但是如果我的需求变成在所有的DaoImpl包里的类的所有的方法都添加记录日志的功能,那再去每一个都添加,工作量大,代码的重用率也不高,而且有的时候你可能没有源代码,所以该

黑马程序员___java动态代理类

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 1.什么是动态代理? 答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象.客户不知道它是与代理打交道还是与实际对象打交道.2.为什么使用动态代理? 答:因为动态代理可以对请求进行任何处理 3.使用它有哪些好处? 答