使用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();
}
本文介绍如何使用JDK代理创建代理对象,并通过实现接口的方法来控制代理行为。具体演示了当对象的name属性为空时不调用目标方法的过程。
862

被折叠的 条评论
为什么被折叠?



