问题的引出
下述所有类均定义在包structure.proxy.dynamicproxy
中。
- 定义一个接口AbstractUserDAO
public interface AbstractUserDAO {
Boolean findUserById(String userId);
}
- 定义一个接口AbstractUserDAO的实现类UserDAO
public class UserDAO implements AbstractUserDAO {
@Override
public Boolean findUserById(String userId) {
System.out.println("findUserById" + userId);
return true;
}
}
- 定义一个接口InvocationHandler的实现类DAOLogHandler
public class DAOLogHandler implements InvocationHandler {
private Object object;
public DAOLogHandler(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("findUserById")) {
System.out.println("before invoke");
}
Object result = method.invoke(object, args);
if (method.getName().equals("findUserById")) {
System.out.println("after invoke");
}
return result;
}
}
- 定义测试类Test
public class Test {
public static void main(String[] args) {
AbstractUserDAO userDAO = new UserDAO();
InvocationHandler handler = new DAOLogHandler(userDAO);
AbstractUserDAO proxy = (AbstractUserDAO) Proxy.newProxyInstance(AbstractUserDAO.class.getClassLoader(),
new Class[] {
AbstractUserDAO.class}, handler);
System.out.println(Objects.equals(userDAO, proxy));
System.out.println("userDAO = " + userDAO);
System.out.println("proxy = " + proxy);
System.out.println("userDAO.getClass() = " + userDAO.getClass());
System