是在程序运行前就已经存在代理类的字节码文件,静态代理通常是对原有业务逻辑的扩充,通过让代理类持有真实对象,在代理类的源代码中调用被代理类方法来添加我们需要的业务逻辑。例如:买车不去工厂而是去4S店。

    (1)创建一个接口:

    1. interface Animal {
    2. public abstract void show();
    3. }

    创建被代理类的对象,在代理类的方法中调用被代理类的方法,在这个过程中可以实现对被代理类的功能的扩充。
    (3)被代理类:

    1. public class Sheep implements Animal{
    2. @Override
    3. public void show() {
    4. System.out.println("我爱吃青草");
    5. }
    6. }

    (2)代理类:

    1. public class Fish implements Animal {
    2. Sheep sheep=new Sheep();
    3. @Override
    4. public void show() {
    5. sheep.show();
    6. System.out.println("我爱游泳!");
    7. }
    8. }


    (4)测试类:

    1. public class Test {
    2. public static void main(String [] args){
    3. Fish fish=new Fish();
    4. fish.show();
    5. }
    6. }

    测试结果:
    2.1、案例一 - 图1

    Sheep最爱吃青草,在他被fish类代理之后还学会了一项新的技能:游泳

    (5)静态代理的缺点:
    如果有多个类需要代理,那么就需要创建多个代理类分别代理目标对象,工作量较大,不利于维护,耦合度也高。