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
用于修饰字段