Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain OfResponsibleity(责任链模式)
JDK动态代理
HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(),
request.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("getParameter".equalsIgnoreCase(method.getName())) {
// 对getParammet方法进行增强
if ("get".equalsIgnoreCase(request.getMethod())) {
//对get请求进行转码
String invoke = (String) method.invoke(request, args);
// 对获得的值进行转码
invoke = new String(invoke.getBytes("iso8859-1"),"utf-8");
return invoke;
} else {
// 不做处理
}
}
return method.invoke(request, args);
}
});
Cglib动态代理
public class TestCglibDynamicProxy {
public static void main(String[] args) {
//1.获得被代理的对象
See see = new SeeChild();
ProxyClassCglib pr = new ProxyClassCglib(see);
See creatSee = pr.creatSee();
creatSee.see();
}
}
class ProxyClassCglib implements MethodInterceptor{
//1.创建一个用来接收代理类对象的成员变量
private See see;
//2.设置构造
public ProxyClassCglib(See see){
this.see = see;
}
/**
* 增强指定方法
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if("see".equals(method.getName())){
/**
* methodProxy.invokeSuper(proxy, args);
* 执行当前代理类的父类中的see的对应方法
* method.invoke(see, args);
* 执行被代理类的对应方法
*/
method.invoke(see, args);
methodProxy.invokeSuper(proxy, args);
System.out.println("增强see");
return null;
}
return method.invoke(see, args);
}
//4.返回代理对象
public See creatSee(){
//1.创建Cglib核心文件
Enhancer enhancer = new Enhancer();
//2.设置父类(设置父类的话,如果设置为父类.class,可以在增强方法中即可调用当前类的方法,也可以调用代理类对应的方法;如果设置代理对象.class,则只可以在增强方法中执行代理对象中对应的方法)
enhancer.setSuperclass(See.class);
//3.设置回调Callback类型,Callback应该是个MethodInterceptor的父接口,没有源码、、
enhancer.setCallback(this);
//4.生成代理类
See see = (See) enhancer.create();
//返回代理对象
return see;
}
}
Java内置注解
@Override
判断该方法是否为重写方法
@Deprecated
表示方法是已经过时的方法
@SuppressWarnings(value)
抑制警告,value表示警告类型
deprecation
忽略过时警告
rawtypes
忽略类型安全警告
unused
忽略不使用警告
unchecked
忽略安全检查
null 忽略空指针警告
all 忽略所有
value的值可以是单个字符串也可以是一个字符串数组
自定义注解
@interface MyAnnotation{
int age;
Strign name;
....
Object obj default new User();//default 表示给定一个默认值
}
若属性名为value,且只有这一个属性时,value可以省略,直接传值;
若属性类型维数组,值只有一个,{}可以省略
元注解
JDK提供了四种元注解
@Retention(RetentionPolicy.XXXX) 确定注解的生命周期
SOURCE 表示被修饰的注解只能存在源码阶段,写代码时起作用
CLASS 存在于字节码阶段,编译时起作用
RUNTIME 存在于运行阶段,运行中起作用
@Target(ElementType.XXXX) 确定注解的使用位置
TYPE 用于修饰类,接口
CONSTRUCTOR
用于修饰构造
METHOD
用于修饰方法
FIELD 用于修饰字段