zoukankan      html  css  js  c++  java
  • java动态代理工厂类

    package com.czp.util;
    
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    
    /**
     * 代理生成工厂,要求其子类实现before(...),after(...),onException(...) 实现处理业务
     * 
     * @author caozhongping
     * 
     */
    public abstract class ProxyFacty<T> implements InvocationHandler {
    
    
        private T target;
        public ProxyFacty(T target) {
            super();
            this.target = target;
        }
    
    
        /**
         * 创建代理,如果目标类没有实现接口则返回自己
         * 
         * @param target
         * @return
         */
        @SuppressWarnings("unchecked")
        public T getProxy() {
            Class<T> cls = (Class<T>) target.getClass();
            if (cls.getInterfaces() != null) {
                return (T) Proxy.newProxyInstance(cls.getClassLoader(),
                        cls.getInterfaces(), this);
            }
            return target;
        }
    
    
        /***
         * 通过代理实现调用
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object obj = null;
            try 
            {
                before(args);
                obj = method.invoke(target, args);
                after(args);
            } catch (Exception e) {
                onException(e);
            }
            return obj;
        }
    
    
        /***
         * 出现异常时处理
         * 
         * @param ex
         */
        public abstract void onException(Exception ex);
    
    
        /**
         * 调用方法后处理
         * 
         * @param args
         */
        public abstract void after(Object[] args);
    
    
        /**
         * 调用方法前处理
         * 
         * @param args
         */
        public abstract void before(Object[] args);
    }
    //目标对象的接口
    
    package com.czp.util;
    
    public interface TestItf {
    
        void say(String name)throws Exception;
    }
    //目标对象
    
    package com.czp.util;
    
    public class TestItfImpl implements TestItf {
    
        @Override
        public void say(String name) throws Exception {
            if(name==null)
                throw new Exception("name is null");
            System.out.println("Hell, "+name);
    
        }
    
    }
    //代理工具类,继承工厂类实现拦截
    package com.czp.util;
    
    
    public class ProxyUtil<T> extends ProxyFacty<T>{
    
        
    
        public ProxyUtil(T target) {
            super(target);
        }
    
        @Override
        public void onException(Exception ex) {
            System.out.println("call Method error:"+ex);
            
        }
    
        @Override
        public void after(Object[] args) {
            System.out.println("----------exit method-----------");
            
        }
    
        @Override
        public void before(Object[] args) {
            System.out.println("-----Enter method------");
            
        }
        public static void main(String[] args) throws Exception {
            TestItf target = new TestItfImpl();//目标对象
            TestItf proxy = new ProxyUtil<TestItf>(target).getProxy();//目标的代理实例
            proxy.say("WengJiaBao");//正常调用
            //异常调用
            proxy.say(null);
        }
    }
    //输出:
    -----Enter method------
    Hell, WengJiaBao
    ----------exit method-----------
    -----Enter method------
    call Method error:java.lang.reflect.InvocationTargetException
  • 相关阅读:
    Linux下压缩解压缩命令
    Linux挂载外部设备
    Ubuntu下安装软件的三种方式
    Linux查看和修改文件权限
    Linux命令行基础操作
    window下常用的cmd命令
    圆角进度条,带数字居中显示的圆角进度条
    上下滑动控件
    window下Jekyll+github搭建自己的博客
    PAT 团体程序设计天梯赛 L1-046 整除光棍(模拟除法)
  • 原文地址:https://www.cnblogs.com/czpblog/p/2865298.html
Copyright © 2011-2022 走看看