参考资料:
http://elathen.itpub.net/post/32506/294971
http://elathen.itpub.net/post/32506/294972
http://elathen.itpub.net/post/32506/294973
示例:
China.java
- package proxy;
- public interface China {
- public void sayOlympic();
- }
Chinese.java
- package proxy;
- public class Chinese implements China {
- public void sayOlympic() {
- System.out.println("北京欢迎你");
- }
- }
ChHandler.java
- package proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- public class ChHandler implements InvocationHandler {
- Object targetForeigner;
- /**
- * 返回动态代理实例
- * Proxy对应Cglib的Enhancer
- * @param chinese
- * @return
- */
- public Object bind(Object chinese){
- this.targetForeigner=chinese;
- return Proxy.newProxyInstance(chinese.getClass().getClassLoader(), chinese.getClass().getInterfaces(),this);
- }
- /**
- * 在Invoke方法中,Dynamic proxy的实现,该方法在被代理类调用方法时自动调用
- */
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- Object foreigner=null;
- System.out.println("奥运会开幕式开始。。。。");
- foreigner=method.invoke(targetForeigner, args);
- System.out.println("奥运会开幕式闭幕。。。。");
- return foreigner;
- }
- }
ChCglib.java
- package proxy;
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.Enhancer;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- public class ChCglib implements MethodInterceptor {
- private Enhancer enhancer=new Enhancer();
- /**
- * 返回动态代理实例
- * Enhancer对应Dynmaic proxy的Proxy
- * @param chinese
- * @return
- */
- public Object bind(Class clz){
- enhancer.setSuperclass(clz);
- enhancer.setCallback(this);
- return enhancer.create();
- }
- /**
- * 在intercept方法中,cglib proxy的实现,该方法在被代理类调用方法时自动调用
- */
- public Object intercept(Object o, Method method, Object[] methodParameters,
- MethodProxy methodProxy) throws Throwable {
- Object foreigner=null;
- System.out.println("奥运会开幕式开始。。。。");
- foreigner=methodProxy.invokeSuper(o, methodParameters);
- System.out.println("奥运会开幕式闭幕。。。。");
- return foreigner;
- }
- }
- package proxy;
- public class ChineseFactory {
- /*
- * 根据类名创建类的实例
- */
- public Object getInstance(String clz){
- Class obj=null;
- try {
- obj=Class.forName(clz);
- return (Object)obj.newInstance();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 根据传入的类名,返回Dynamic proxy AOP代理对象
- * @param clzName
- * @return
- */
- public Object getAopObjectProxy(String clz){
- //ChHandler hander=new ChHandler();
- ChHandler hander=(ChHandler)getInstance("proxy.ChHandler");
- return hander.bind(getInstance(clz));
- }
- /**
- * 根据传入的类名,返回cglib AOP代理对象
- * @param clzName
- * @return
- */
- public Object getCglibObjectProxy(String clz){
- //ChCglib cglib=new ChCglib();
- ChCglib cglib=(ChCglib)getInstance("proxy.ChCglib");
- return cglib.bind(getInstance(clz).getClass());
- }
- }
- package proxy;
- public class ChineseApp {
- public static void main(String[] args) {
- Object foreigner;
- //Dynamic proxy测试
- //原始做法
- China chinese=new Chinese();
- ChHandler handler=new ChHandler();
- foreigner=handler.bind(chinese);
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy basic");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //反射机制做法
- ChineseFactory factory=new ChineseFactory();
- handler=(ChHandler)factory.getInstance("proxy.ChHandler");
- foreigner=handler.bind((China)(factory.getInstance("proxy.Chinese")));
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy reflect");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //反射机制+工厂做法
- factory=new ChineseFactory();
- foreigner=factory.getAopObjectProxy("proxy.Chinese");
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy reflect factory");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //cglib测试
- //反射机制做法
- ChCglib cglib=new ChCglib();
- Chinese chin=new Chinese();
- foreigner=cglib.bind(chin.getClass());
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy basic");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:中国反对将奥运政治化的外国人");
- }
- //反射机制+工厂做法
- factory=new ChineseFactory();
- cglib=(ChCglib)factory.getInstance("proxy.ChCglib");
- foreigner=cglib.bind(factory.getInstance("proxy.Chinese").getClass());
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy reflect");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:中国反对将奥运政治化的外国人");
- }
- //工厂做法之二
- foreigner=factory.getCglibObjectProxy("proxy.Chinese");
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy factory");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:北京反对将奥运政治化的外国人");
- }
- }
- }
本文通过示例代码详细介绍了如何使用Java动态代理和Cglib实现面向切面编程(AOP)。包括了基本原理、核心代码实现及不同场景下的应用方式。
243

被折叠的 条评论
为什么被折叠?



