直接上代码,需要注意的地方已经加上注释。
接口
1 package com.proxy.service; 2 3 public interface AopService { 4 public void save(); 5 }
实现类
1 package com.proxy.service.impl; 2 3 import com.proxy.service.AopService; 4 5 public class AopServiceImpl implements AopService { 6 7 private String user = null; 8 9 public String getUser() { 10 return user; 11 } 12 13 public void setUser(String user) { 14 this.user = user; 15 } 16 17 public AopServiceImpl() { 18 } 19 20 public AopServiceImpl(String user) { 21 this.user = user; 22 } 23 24 @Override 25 public void save() { 26 System.out.println("调用了save()方法"); 27 } 28 }
代理工厂类--使用JDKproxy技术实现
1 package com.proxy.factory; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import com.proxy.service.impl.AopServiceImpl; 8 9 public class ProxyFactory implements InvocationHandler{ 10 private Object targetObject=null; 11 12 13 public Object creatObjectIntance(Object targetObject){ 14 this.targetObject=targetObject; 15 //传过来的对象必须实现接口 16 //利用反射技术获取ClassLoader和interface集合 17 //最后一个参数是回调函数,我们需要在本类中实现InvocationHandler接口 然后重写invoke()方法,方法内容见下 18 return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); 19 } 20 21 22 @Override 23 public Object invoke(Object proxy, Method method, Object[] args) 24 throws Throwable { 25 AopServiceImpl aopService=(AopServiceImpl) this.targetObject; 26 if(aopService.getUser()!=null){ 27 //判断用户名不为空就调用方法 28 return method.invoke(this.targetObject, args); 29 }else{ 30 //判断用户名为空就返回空,不调用实现类中的方法 31 return null; 32 } 33 } 34 35 }
单元测试类
1 package junit.test; 2 3 import org.junit.Test; 4 5 import com.proxy.factory.ProxyFactory; 6 import com.proxy.service.AopService; 7 import com.proxy.service.impl.AopServiceImpl; 8 9 10 public class ProxyUnitTest { 11 12 @Test public void ProxyTest(){ 13 ProxyFactory factory=new ProxyFactory(); 14 AopService aopService=(AopService) factory.creatObjectIntance(new AopServiceImpl()); 15 aopService.save(); 16 } 17 }