java动态代理简介:
代理,故名思意,就是在不修改原对象的基础上,为被代理对象创建代理对象,代理对象具有被代理对象的全部功能。动态,有两层含义,第一层,代理对象除具有被代理对象的基础功能外还具有一些额外功能,这些额外功能可由程序员自行随意定义;第二层,代理对象的创建时在程序执行时创建的,而非编译时就已经生成了原型程序。
java动态代理涉及成员:
动态代理程序应包括,被代理对象接口,被代理对象类,代理处理器类,代理客户端四部分。以下对四部分功能一一做说明:
被代理对象: 给代理处理器类处理的对象,在代理处理器类实例化的时候作为构造函数参数传入代理处理器对象。里面包含代理对象接口的实现,也是程序的主要业务功能核心;
代理处理器: 负责完成被代理对象的功能,除此之外还可以在其中第一额外功能,在核心功能之前和之后都可定义业务,有种面向切片的思想;
代理客户端: 得到代理对象,并执行功能的场所,是代理的具体应用场景。
java动态代理实现:
以一个简单的动物Animal, 猫Cat, TraceHandler, ProxyTest 来作为练习实例,以下是各个类的实现,以及代理客户端的运行结果:
Animal:
package com.sunsharing.practice;
/**
* Created by baich on 2016/2/24.
*/
public interface Animal {
public void info();
}
Cat:
package com.sunsharing.practice; /** * Created by baich on 2016/2/24. */ public class Cat implements Animal { public void info() { System.out.println("this is a cat, the language is miaomiao~"); } }
TraceHandler:
package com.sunsharing.practice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * Created by baich on 2016/2/24. */ public class TraceHandler implements InvocationHandler { private Object target; public TraceHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("INFO: " + target.getClass().getName() + " staring..."); Object ob = method.invoke(target, args); System.out.println("INFO: " + target.getClass().getName() + " ending..."); return ob; } }
ProxyTest:
package com.sunsharing.practice;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* Created by baich on 2016/2/24.
*/
public class ProxyTest {
public static void main(String[] args) {
Animal cat = new Cat();
InvocationHandler handler = new TraceHandler(cat);
Object proxyObj = Proxy.newProxyInstance(cat.getClass().getClassLoader(),
cat.getClass().getInterfaces(), handler);
if (proxyObj instanceof Animal) {
System.out.println("proxyObj is the instanceof Animal");
((Animal) proxyObj).info();
} else {
System.out.println("proxyObj is not the instanceof Animal");
}
}
}
以下是代理客户端的使用结果:
补充及参考资料:
代理对象是被代理对象接口的 实现,但并不是被代理对象类的子类。
参考资料:java动态代理实现: http://www.blogjava.net/thisliy/archive/2009/10/24/299621.html
java动态代理实现: