按照代理类的创建时期,代理类可分为两种。
l 静态代理类:由程序员创建或由特定工具自动生成
源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
l 动态代理类:在程序运行时,运用反射机制动态创建而成。
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代码实例:
- package ttitfly.proxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class DynamicProxy implements InvocationHandler{
-
- private Object object;
-
-
- public Object bindRelation(Object object){
- this.object = object;
- return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("Welcome");
- Object result = method.invoke(object, args);
- return result;
- }
-
- }
测试类:
java 代码
- package ttitfly.proxy;
-
- public class TestDynamicProxy {
- public static void main(String[] args){
- HelloWorld helloWorld = new HelloWorldImpl();
- DynamicProxy dp = new DynamicProxy();
-
- HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
- helloWorld1.print();
- helloWorld1.say();
-
-
- HelloWorld helloWorld2 = new HelloWorldImpl();
- helloWorld2.print();
- helloWorld2.say();
-
- }
- }
------君临天下,舍我其谁
------