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

Java实现AOP切面(动态代理)

时间:2018-02-21 18:39:32      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:客户   生成   ret   blog   ati   loader   lib   cep   实现类   

Java.lang.reflect包下,提供了实现代理机制的接口和类:

  1. public interface InvocationHandler

    InvocationHandler 是代理实例的调用处理程序 实现的接口。

  2. public class Proxy extends Object implements Serializable     

    Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

Java的动态代理依赖于接口,虽然在生成效率上较高,但是执行效率比较慢,而且Java的反射机制本身消耗的资源就比一般的调用来得更大一点。

Spring中给予客户端自主选择是使用Java的动态代理还是使用CGLIB第三方代理实现,两者各有特点。

简单地说,Java的代理机制实现如下:

  1. 创建业务对象;
  2. 创建处理程序;
  3. 创建代理类;

示例:

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

/**
 * Created by lay on 21/02/2018.
 */
public class ProxyDemo {

    public static void main(String[] args) {
        // 创建 被代理对象
        FooService fooService = new FooServiceImpl();
        // 实现 被代理对象 的处理程序
        InvocationHandler handler = new MyInvocationHandler(fooService);
        // 返回 代理对象
        FooService fooServiceProxy = (FooService) Proxy.newProxyInstance(fooService.getClass().getClassLoader(), fooService.getClass().getInterfaces(), handler);
        // 代理对象调用方法
        fooServiceProxy.getData();
    }
}
/**
 * 定义用户接口
 * Created by lay on 21/02/2018.
 */
public interface FooService {
    void getData();
}
/**
 * 实现用户接口
 * Created by lay on 21/02/2018.
 */
public class FooServiceImpl implements FooService {

    @Override
    public void getData() {
        System.out.println("调用了FooService实现类方法---getData...");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 实现JDK动态代理接口
 * Created by lay on 21/02/2018.
 */
public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行前...");
        Object result =  method.invoke(target,args);
        System.out.println("执行后...");
        return result;
    }
}

 

Java实现AOP切面(动态代理)

标签:客户   生成   ret   blog   ati   loader   lib   cep   实现类   

原文地址:https://www.cnblogs.com/lay2017/p/8457008.html

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