Java回炉重造(二)静态代理
说明
代理就是中介,通过代理访问一个类可以获得这个类的增强版。比如一个UserDao接口的实现类UserDaoImpl的login方法,通过设置UserDaoImpl的代理类,在login方法前加上安全性检测代码,在login方法后加上日志记录代码,再调用代理类的login方法时就会执行带有安全检测和日志记录的login方法。不但不会污染原来的login方法,更改代理中的login也不会影响程序,有点AOP面向切面编程的意思。
代码运行结果:
代码
UserDao.java
package cn.pangpython.acl.proxy;
/**
* 用户数据库操作接口类
* @Project ApacheCommonsLearn
* @Package cn.pangpython.acl.proxy
* @Author pangPython
* @Time 上午8:33:47
*/
public interface UserDao {
/*
* 登录方法
*/
public boolean login(String UserName,String PassWord);
}
UserDaoImpl.java
package cn.pangpython.acl.proxy;
/**
* @Project ApacheCommonsLearn
* @Package cn.pangpython.acl.proxy
* @Author pangPython
* @Time 上午8:38:26
*/
public class UserDaoImpl implements UserDao {
@Override
public boolean login(String UserName, String PassWord) {
System.out.println("用户名:"+UserName+"密码:"+PassWord+" ===正在登录!");
return true;
}
}
UserDaoProxy.java
package cn.pangpython.acl.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @Project ApacheCommonsLearn
* @Package cn.pangpython.acl.proxy
* @Author pangPython
* @Time 上午8:41:03
*/
public class UserDaoProxy implements InvocationHandler {
private Object target;
public UserDaoProxy(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
System.out.println("检查登录参数...");
Object obj = method.invoke(target, args);
System.out.println("记录登录日志...");
return obj;
}
}
TestProxy.java
package cn.pangpython.acl.proxy;
import java.lang.reflect.Proxy;
/**
* @Project ApacheCommonsLearn
* @Package cn.pangpython.acl.proxy
* @Author pangPython
* @Time 下午3:45:11
*/
public class TestProxy {
public static void main(String[] args) {
UserDaoProxy userDaoProxy = new UserDaoProxy(new UserDaoImpl());
UserDao userDao = (UserDao) Proxy.newProxyInstance(UserDaoImpl.class.getClassLoader(), UserDaoImpl.class.getInterfaces(), userDaoProxy);
userDao.login("test", "test");
}
}