JAVA动态代理(拦截器)

原创 2013年12月04日 10:02:45
定义一个接口

 

package hb.servlet.intercepter;

public interface Dog {
	public void info();
	public void run();
}
 

接口的实现

 

package hb.servlet.intercepter;

import org.apache.log4j.Logger;

public class DogImpl implements Dog {

	private static Logger log = Logger.getLogger(DogImpl.class);
	
	public void info() {
		log.info("一只猎狗");
	}

	public void run() {
		log.info("我奔跑迅速");
	}

}

 

拦截器方法

 

package hb.servlet.intercepter;

public class DogIntercepter {
	public void method1() {
		System.out.println("111111111模拟通用方法一");
	}

	public void method2() {
		System.out.println("222222222模拟通用方法二");
	}

}

 

代理类的实现

 

package hb.servlet.intercepter;

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

public class ProxyHandler implements InvocationHandler {

	private Object target;
	DogIntercepter di = new DogIntercepter();

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;

		if (method.getName().equals("info")) {
			di.method1();
			result = method.invoke(target, args);
			di.method2();
		} else {
			result = method.invoke(target, args);
		}
		return result;

	}

	public void setTarget(Object o) {
		this.target = o;
	}

}

 

 

代理类工厂

 package hb.servlet.intercepter;

import java.lang.reflect.Proxy;

public class MyProxyFactory {

	public static Object getProxy(Object object) {
		ProxyHandler handler = new ProxyHandler();
		handler.setTarget(object);
		// 第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
		// 第二个参数是接口数组,正是代理该接口的数组
		// 第三个参数是代理包含的处理实例
		return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), object
				.getClass().getInterfaces(), handler);
	}

}
 

测试

 

package hb.servlet.intercepter;

public class TestDog {

	public static void main(String[] args) {
		Dog targetObject = new DogImpl();

		Dog dog = null;

		Object proxy = MyProxyFactory.getProxy(targetObject);
		if (proxy instanceof Dog) {
			dog = (Dog) proxy;
		}
		dog.info();
		dog.run();
	}
}
 

 

 

 

 

相关文章推荐

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高。于是CGLIB就诞生了。 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用AS...
  • ffm83
  • ffm83
  • 2015年02月11日 10:04
  • 1108

JAVA动态代理(拦截器)

该实例是模拟安全性检查   被代理对象接口定义 Java代码   public interface UserManager {       public void...

好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一。1、 JAVA中代理的概念动态代理技术就是用来产生一个对...
  • ffm83
  • ffm83
  • 2015年02月10日 09:58
  • 1970

mybatis -- 由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

转载自: http://zhangbo-peipei-163-com.iteye.com/blog/2033832 最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把...

struts2拦截器(JDK反射,JDK动态代理)

struts2拦截器(JDK反射,JDK动态代理) 拦截器的意义:   大家都知道,DRY(Don't Repeat Yourself,不要书写重复的代码)规则是软件开发过程中的一条重...

由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了一遍,为了温故而知新,在此就按照自己的理解由浅入深的理解一下它的设计。 和大家分享一下...

Mybaitis 原理之动态代理拦截器

由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理            最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了...

Apache commons Proxy简介和动态代理、动态拦截器实现

Apache Commons Proxy 是Apache 的一个之项目,封装了 Java 对象代理的一些常用方法。又叫做 动态代理。 动态代理的作用非常大,在很多底层框架中都会用得到,比如strut...
  • ffm83
  • ffm83
  • 2014年12月29日 17:03
  • 1510

java 动态代理实现注解日志拦截

  • 2016年04月02日 22:47
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA动态代理(拦截器)
举报原因:
原因补充:

(最多只允许输入30个字)