增强一个对象的某个方法有几种方式?
a.继承
条件:需要知道其父类
b.装饰者模式
不需要知道其父类是谁,只知道其实现的哪个借口即可
条件:装饰者与被装饰者需要实现同一个接口;装饰者有被装饰者的引用
c.动态代理
条件:必须知道被代理的类或者对象是谁
1.动态代理
使用动态代理很简单,明白动态代理能做什么和使用的条件即可。
注:java已经给我们提供好了使用动态代理的方法,我们只需要运用proxy的方法即可。
方法:
Interface BeanProxy=Proxy.NewProxyInstance(
ClassLoader loader,
Interface,
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//invoke(np.getClass().newInstance(), method, args);
method.invoke(np.getClass().newInstance(), args);
System.out.println("增强方法");
return null;
}){};
参数分析:
a.Classloader代表被代理类所实现接口的加载器
b.Interface代表被代理类所实现的接口(可以是多个接口)
c.InvocationHandler代表需要增强的方法(内容)
细节1:BeanProxy.方法();无论执行的是类的哪一个方法,都会执行一遍invoke方法。
细节2:判断只对某个方法进行增强,其他方法不增强。(可以使用if)
细节3:return返回值,谁调用返回给谁,返回的内容就是最终的结果。
2.注解
常见的注解:@voerride 标记方法重写
@SuppressWarnings 压制警告
@Deprecated 标记方法过时
元注解:@Target 描述注解的适用范围
@Retention 表示需要在什么级别保存该注解,描述注解的生命周期
自定义注解:注解的本质--接口
注解的属性名--接口方法的方法名
注解的属性值--接口方法的返回值
注:注解的出现其实是为了替代xml,但是没有完全替代
自定义的注解,如果只有一个方法,通常起名为value,并且在添加注解属性的时候可以省略value。
补充:类加载器
class文件加载到内存中形成class对象,这个过程就是累加载,而做这件事的东西就是加载器。
类加载器的组成:引导类加载器 扩展类加载器 应用类加载器