静态代理和动态代理
动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。
动态代理实现:首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。
静态代理:
优点:
1、 实现松散耦合。
2、做到在不修改目标对象的功能前提下,对目标功能扩展。
缺点:
如果项目中有多个类,则需要编写多个代理类,工作量大,不好修改,不好维护,不能应对变化。
一、静态代理
创建接口
public interface Examable {
void exam();
}
创建学生类实现接口
public class Student implements Examable {
@Override
public void exam() {
System.out.println("超级无敌棒棒糖!");
}
}
创建代理对象
public class Cheater implements Examable {
//被代理对象
private final Examable student;
public Cheater(Examable student){
this.student=student;
}
@Override
public void exam() {
System.out.println("现场漂移");
student.exam();//调用Student类的方法
}
}
测试
public class MainTest {
//组合优于继承
public static void main(String[] args)