动态代理怎么理解
要理解动态代理,就要先理解什么是“动态”,什么是“代理”。
动态
一般情况下如果想实现接口,就直接在代码里面创建一个该接口的实现类即可,然后代码直接运行起来就可以了。这种情况下,在代码运行前接口的实现类就已经通过硬编码的方式编写好了。
之所以称为“动态”,是因为接口的实现类并不是事先编写好的,而是在代码运行时生成的。这样的类就叫动态类,而由动态类创建的实例,就叫作动态实例。
代理
我们往往不会凭空生成动态类,这么做没有意义。通常是为了指定的目标对象创建代理才会这么做,所以才叫动态代理。
什么时候使用动态代理
常规的代理模式如下:
public interface Image {
void display();
}
public class RealImage implements Image {
@Override
public void display() {
System.out.println("Displaying image");
}
}
public class ProxyImage implements Image {
private Image realImage;
public ProxyImage(Image realImage){
this.realImage = realImage;
}
@Override
public void display() {
System.out.println("loading...");
realImage.display();
System.out.println("this image is beautiful.");
}
}
要想实现这样的代理模式有一个前提条件,那就是你能访问得了接口(即上例中的接口Image)。但是有时候接口是访问不到的,如第三方库(jar、aar)中的类的内部私有接口。这时候想要按照常规的方式创建代理类是不可能的。这时就可以使用动态代理类。
动态代理类的创建和使用,网络上有很多这里就不多说明了。本文意在阐述“对动态代理的理解”和“要什么时候才使用动态代理”。