什么是动态代理
调用Proxy返回一个代理对象,使用这个代理对象执行你的方法时,它会先执行代理对象里的方法再执行你的业务方法。
作用
业务层代码专注业务处理,添加新功能时,如日志,事务等,不影响业务代码。
实践
1、添加一个接口:
public interface UserManager {
public void add(String username, String password);
public void del(int userId);
}
2、实现接口:
public class UserManagerImpl implements UserManager {
@Override
public void add(String username, String password) {
System.out.println("---------UserMangerImpl.add()-----------");
}
@Override
public void del(int userId) {
System.out.println("---------UserMangerImpl.del()-----------");
}
}
3、添加一个代理类:
public class SecurityHandler implements InvocationHandler {
private Object target;
private void checkSecurity() {
System.out.println("-------------check security------------");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
checkSecurity();
return method.invoke(target, args);
}
public Object createProxyInstance(Object target) {
this.target = target;
/**
* ClassLoader loader:Java类加载器; 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* Class<?>[] interfaces:被代理类的所有接口信息; 如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),便于生成的代理类可以具有代理类接口中的所有方法
* InvocationHandler h:调用处理器; 调用实现了InvocationHandler 类的一个回调方法
* */
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
}
4、测试
public class Test {
public static void main(String[] args) {
UserManager userManager = new UserManagerImpl();
userManager.add("aaa", "123");
userManager.del(123);
SecurityHandler handler = new SecurityHandler();
UserManager userManagerProxy = (UserManager) handler.createProxyInstance(new UserManagerImpl());
userManagerProxy.add("aaa", "123");
userManagerProxy.del(123);
}
}