使用JDK代理,代理对象必须实现一接口
com.spring305.test.aop.dao.UserDao.java
public interface UserDao { void print1(); void print2(); }
实现方法:com.spring305.test.aop.dao.impl.UserDaoImpl.java
public class UserDaoImpl implements UserDao { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public UserDaoImpl(String name){ this.name = name; } @Override public void print1() { System.out.println(UserDaoImpl.class.toString()+" print1()"); } @Override public void print2() { System.out.println(UserDaoImpl.class.toString()+" print2()"); } }
com.spring305.test.aop.dao.ProxyFactory.java
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.spring305.test.aop.dao.impl.UserDaoImpl; public class ProxyFactory implements InvocationHandler { private Object target; public Object createUserDaoImp(Object target){ this.target = target; return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this); } @Override public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { UserDaoImpl udImpl = (UserDaoImpl)target; Object result = null; if(udImpl.getName() == null){//name属性为空时才调用 result = arg1.invoke(target, arg2); } return result; } }
测试代码:
@Test //用户名为空,不执行方法 public void testProxy(){ ProxyFactory pf=new ProxyFactory(); UserDao ud=(UserDao) pf.createUserDaoImp(new UserDaoImpl(null)); ud.print1(); } @Test //用户名为不为空,才执行save方法 public void testProxy2(){ ProxyFactory pf=new ProxyFactory(); UserDao ud=(UserDao) pf.createUserDaoImp(new UserDaoImpl("张某")); ud.print2(); }