动态代理-JDK_proxy&cglib

一、简介

动态代理的实现方式较常用的方式有两种,用jdk的proxy类实现,必须依赖接口。或者使用cglib的扩展包实现,因为是产生类的子类所以代理的类不能为final类。

二、示例

1、 其中UserServiceImpl 是 UserService的实现

( UserServiceImpl implements UserService )

2、使用JDK的Proxy进行代理

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

public class JDKProxyTestMain {

	public static void main(String[] args) {
		UserService proxyUserService = (UserService) Proxy
				.newProxyInstance(UserServiceImpl.class.getClassLoader(),
						UserServiceImpl.class.getInterfaces(),
						new JDKInvocationHandler(new UserServiceImpl()));
		proxyUserService.save();
	}
}

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

public class JDKInvocationHandler implements InvocationHandler {
	private Object targetObject;

	public JDKInvocationHandler(Object targetObject) {
		this.targetObject = targetObject;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("--1---");
		Object result = method.invoke(targetObject, args);
		System.out.println("--2---");
		return result;
	}

}

3、使用cglib进行代理实现

import net.sf.cglib.proxy.Enhancer;
...

public class CglibTestMain {
	public static void main(String[] args) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(UserServiceImpl.class);
		enhancer.setCallback(new CglibMethodInterceptor(new UserServiceImpl()));
		UserServiceImpl userServiceProxy= (UserServiceImpl) enhancer.create();
		userServiceProxy.save();
	}
}

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibMethodInterceptor implements MethodInterceptor {
	private Object targetObj;

	public CglibMethodInterceptor(Object targetObj) {
		this.targetObj = targetObj;
	}

	@Override
	public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println("---begin---");
		Object result = method.invoke(this.targetObj, args);
		System.out.println("---end---");
		return result;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值