****
1,使用动态代理实现aop
public interface UserDao { void save(); } public class UserDaoImpl implements UserDao { private String name; public void save() { System.out.println("save() is called, name: "+name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ProxyFactory.java
package com.maple.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.maple.dao.UserDao; import com.maple.dao.impl.UserDaoImpl; public class ProxyFactory implements InvocationHandler { private Object target; public Object createUserDao(Object target){ this.target=target; return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(proxy.getClass().getName()); Object result=null; UserDaoImpl userDao=(UserDaoImpl)this.target; if(userDao.getName()!=null){ result=method.invoke(userDao, args); }else{ System.out.println("the name is null"); } return result; } }
测试
@Test public void test() { ProxyFactory pf=new ProxyFactory(); UserDaoImpl u=new UserDaoImpl(); u.setName("maple"); UserDao userDao=(UserDao) pf.createUserDao(u); userDao.save(); }
输出:
$Proxy5
save() is called, name: maple
****