代理模式(动态代理)
程序员文章站
2024-01-01 12:01:10
...
这里我们来介绍代理模式,开放中我们结肠接触到的代理一般有两种,一种是动态代理,一种是cglib代理,cglib代理在spring中有大量的应用,而我们这里暂时先来介绍一下动态代理
显示生活中我们也接触到各种各样的代理,不如我们要找老板,我们是不可能直接找到老板的,这是时候我们需要小秘来帮我们找到老板,这里的小秘就是我们这里所说的代理模式。
代理模式核心作用如下:
1、通过代理控制对象的访问权限。
2、可以详细控制某个对象的方法,在调用方法前做前置处理,调用后做后置处理。
代理模式在实际开发中有很多地方都用到了
1、数据库连接池关闭处理。
2、Mybatis中实现拦截器插件。
3、AspectJ的实现
4、Spring中AOP的实现。
5、声明事务
6、RMI远程方法调用
前面我们说过代理模式分为两种,一种是静态代理,一种是动态代理,所谓静态代理就是为要代理的类写一个代理类,或者用工具为其生成一个代理类,也就是在程序运行前就存在已编译好的代理类,缺点是繁琐,不灵活。而动态代理更具灵活性,因为他不用在设计的阶段就指定某一个代理类来代理哪一个被代理的对象,而是可以把这种指定延迟到程序运行时有JVM来实现。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
interface Star{
void signContract();
void sing();
void collectMoney();
}
class realStart implements Star{
@Override
public void signContract() {
// TODO Auto-generated method stub
System.out.println("明星自己签合同");
}
@Override
public void sing() {
// TODO Auto-generated method stub
System.out.println("明星自己唱歌");
}
@Override
public void collectMoney() {
// TODO Auto-generated method stub
System.out.println("明星自己收钱");
}
}
class StarHandler implements InvocationHandler{
private Star star;
public StarHandler(Star star) {
super();
this.star = star;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object =null;
System.out.println("方法执行前");
if(method.getName().equals("sing"))
object = method.invoke(star, args);
else
System.out.println("代理处理"+method.getName());
System.out.println("方法执行后");
return object;
}
}
常见的动态代理有以下四种
1、JDK自带的动态代理,也就是上面的代码
2、javaassist 字节码操作库实现。
3、CGLIB
4、ASM