在千锋“逆战”学习第53天
每日一句:人呐,眼光放得长远一些,看到的东西也会多一些,生活也就会过得更有意义一点。
今天学习了反射中的装饰者设计模式、动态代理;注解中的内置注解、自定义注解、元注解。
明天继续努力。
知识点总结
思维导图
课堂代码
- 装饰者设计模式
//1,定义装饰类(增强类)实现和被装饰类(被增强类)相同的接口
public class UserDaoWrapper implements UserDao {
// 2,在装饰类中声明被装饰类的引用
private UserDao userDao ;
public UserDaoWrapper(){
}
public UserDaoWrapper(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser() {
System.out.println("权限校验");
userDao.addUser();
System.out.println("日志记录");
}
@Override
public void deleteUser() {
userDao.deleteUser();
}
@Override
public void updateUser() {
userDao.updateUser();
}
@Override
public void selectUser() {
userDao.selectUser();
}
}
- Proxy动态代理
- 方式一:定义类实现InvocationHandler接口
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();//被代理类对象
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),
new MyInvocationHandler(userDao));
userDaoProxy.addUser();
userDaoProxy.deleteUser();
userDaoProxy.updateUser();
userDaoProxy.selectUser();
}
/**
* 增强代理类
*/
class MyInvocationHandler implements InvocationHandler{
//声明一个被代理类的引用
private UserDao userDao;
public MyInvocationHandler(UserDao userDao) {
this.userDao = userDao;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// Method method : 被代理类的原方法
// Object[] args :被代理类的方法的实际参数
//执行被代理类中的原方法
String methodName = method.getName();
Object returnValue = null;
if ("addUser".equals(methodName)) {
//只有addUser需要增强
System.out.println("权限校验");
returnValue = method.invoke(userDao, args);//执行被代理类中的原方法
System.out.println("日志记录");
} else {
//其他的方法不增强
method.invoke(userDao,args);//执行被代理类中的原方法
}
return returnValue;
}
}
- 使用InvocationHandler接口的匿名内部类对象
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
//使用匿名内部类对象
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),
new InvocationHandler() {//处理增强
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
Object returnValue = null;
if ("deleteUser".equals(methodName)) {
System.out.println("权限校验");
returnValue = method.invoke(userDao, args);
System.out.println("日志记录");
} else {
returnValue = method.invoke(userDao, args);
}
return returnValue;
}
});
userDaoProxy.deleteUser();
userDaoProxy.addUser();
}