登录 
欢迎来到陈冬冬(雪地里走)的学习天地 | 经验分享整理平台 | 陈冬冬
 服务器本次启动于:17天前 

Java动态代理之实现方法拦截

2019-09-02 22:06:26 阅读:()

记得在很早的时候(https://www.chendd.cn/information/viewInformation/other/75.a)通过学习视频了解到的Java的动态代理,照着敲出来的示例当时也只是似懂非懂的,直到后面再看视频的时候看到了基于List接口实现的代理,这次是真的懂了许多了,然而长时间抛在脑后时间久了就又需要花费时间去捡起,如果不是下篇文章所实现的示例,可能不会这么快整理出来本篇文章。

本次示例使用动态代理实现方法的前置与后置拦截,与Spring AOP的拦截器一样,可以根据特定类的路径、方法的规则、参数的类型等方式的限定拦截,懒得写了,就当本文是作为个人的笔记分享吧。

代理类

package cn.chendd.tips.examples.proxy;

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

/**
 * @author chendd
 * @since 2019-08-31 22:15
 * List
代理示例,简单的List类方法拦截实现
 
*/
public class ObjectProxyHandler implements InvocationHandler {

   
private Object target;
   
private Method method;

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

   
@Override
   
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
       
this.method = method;
        Object result =
null;
       
this.before();
       
try {
            result = method.invoke(
target , args);//方法出错时不执行后置方法
           
this.after();
        }
catch (Exception e) {
           
this.exception(e);
        }
       
return result;
    }

   
/**
     *
方法前置
    
*/
   
private void before() {
        System.
out.println("invoke " + method.getName() + " before");
    }

   
/**
     *
方法后置
    
*/
   
private void after(){
        System.
out.println("invoke " + method.getName() + " after");
    }

   
/**
     *
异常处理
    
* @param e
    
*/
   
public void exception(Exception e){
        System.
err.println("invoke " + method.getName() + " exception");
    }

}

测试类

package cn.chendd.tips.examples.proxy;

import org.junit.Test;

import java.lang.reflect.Proxy;
import