java 动态代理,反射 回顾

94 阅读2分钟

有很多文章写的很好了,我来搬运下。

理解java反射

www.cnblogs.com/haodawang/p…

java动态代理

www.cnblogs.com/gonjan-blog…

\

说说为什么yao用动态代理

1. 一般情况下,想要对一个现有的方法添加一些额外的操作有这样几种办法:

比如:

public void test(){

System.out.println("hello world");

}

在这个方法输出hello world前添加一个log记录:(这里我们简单就输出一下)

    System.out.println("log");

\

1.直接改源代码,直接添加代码:

public void test(){

    System.out.println("log");

    System.out.println("hello world");

}

这样做非常不灵活,死板,如果有上千个方法都要添加log实现,就不行了。

2.使用继承,创建一个子类继承当前类,然后调用super方法实现。

class childclass extends fatherclass{

    public void test(){

    System.out.println("log");

    super.test();

}

}

这个比改源代码好很多,但是耦合性还是很高,一旦父类发生改变,所有的子类都要变化。同时,我如果想要把两个父类的应用合并,比如说要给另外一个类的save方法添加相同的log,我就得再写一个子类去添加log记录,因为继承永远是单线操作的,你不能同时继承两个类。

3.使用组合,相当于把继承改为实现接口,因为多个类可以实现同一个接口,这样的话不同的类可以实现相互的调用。

class test1 implements interfaceOriginal(){

        public void test(){

        System.out.println("hello world");

    }

}

class test2 implements interfaceOriginal(){

    interfaceOriginal inter = new test2(); //new 一个test2的对象

    public void test(){

        System.out.println("log");

        inter.save();

    }

}

如果我们想要在这基础之上把两个应用合并,比如在加上log上面再加上时间记录 System.out.println("time");

class test3 implements interfaceOriginal(){

    interfaceOriginal inter2 = new test2();

    public void test(){

        System.out.println("time");

        inter2.test();//这个test已经在前面添加了log记录。

    }

}

注意这里的区别,继承无法给其他不是父类的类添加代码。比如这里test2 是另外一个类,他和test1之间没有相互继承,那么如果test3继承了test1,他并不能对test2添加方法。继承是单线的操作。

但是这样套来套去并还不够好,如果有1000个方法需要处理,代码量还是很大。

\

4.这个时候就是动态代理了。动态的遍历所有方法,动态的添加想要添加的任意一个操作,比如log或者time。

\