JDK的动态代理

JDK的动态代理的小案例

jdk动态代理的介绍:需要有接口和实现类

  1. 目标类的接口
package com.fxy.spring.jdkproxy;

public interface UserService {
	public void addUser();
	public void updateUser();
	public void deleteUser();
}
  1. 目标类的代码(target)
package com.fxy.spring.jdkproxy;

public class UserServiceImp implements UserService {

	@Override
	public void addUser() {
		System.out.println("JDK_proxy  addUser");
	}

	@Override
	public void updateUser() {
		System.out.println("JDK_proxy  updateUser");
	}

	@Override
	public void deleteUser() {
		System.out.println("JDK_proxy  deleteUser");
	}
	
}
  1. 切面代码(advice)
package com.fxy.spring.jdkproxy;

public class MyAspect {
	public void Before() {
		System.out.println("执行前方法");
	}
	public void After() {
		System.out.println("执行后方法");
		System.out.println("***************");
	}
}

5.工厂类代码:

package com.fxy.spring.jdkproxy;

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

public class MybeanFactory {
	public static UserService createUserService() {
		MyAspect myAspect = new MyAspect();
		UserService userService = new UserServiceImp();
		UserService proxyService = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(), 
														  userService.getClass().getInterfaces(),
														  new InvocationHandler() {
															@Override
															public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
																myAspect.Before();
																Object obj = method.invoke(userService, args);
																myAspect.After();
																return obj;
															}
														});
		return proxyService;
	}
}
  1. 测试代码:
ackage com.fxy.spring.jdkproxy;

import org.junit.Test;

public class TestJDK {
	@Test
	public void test() {
		UserService userService = MybeanFactory.createUserService();
		userService.addUser();
		userService.updateUser();
		userService.deleteUser();
	}
}

目的
在切入点(要增强代码的方法)前后加入advice新的方法
过程

  1. 目标类中有三个方法,addUser(),updateUser(),deleteUser().
  2. 切面类中有两个方法,分别是After()和Before()方法。
  3. 工厂类生成代理目标类的对象。
  4. 首先在工厂类中生成目标类的对象和切面类的对象。
  5. 生成代理对象。
  6. UserService proxyService = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { myAspect.Before(); Object obj = method.invoke(userService, args); myAspect.After(); return obj; } });
    newProxyInstance中的三个参数:第一个生成类加载器,第二个获得目标类的所有接口,第三个执行代理对象的方法:在这里将目标类方法和切面类方法结合到一起。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值