动态代理

来源:互联网 发布:文章cms 编辑:程序博客网 时间:2024/05/16 06:21

从输入流中得到text

public static String getTextFromStream(InputStream is){        byte[] b = new byte[1024];        int len=0;        //字节数组输出流,读取输入流文本数据的同时,把数据写入输出流        ByteArrayOutputStream bos = new ByteArrayOutputStream();        try {            while((len=is.read(b))!=-1){                bos.write(b,0,len);            }            //字节数组输出流中的数据转换成字节数组            return new String(bos.toByteArray());        } catch (IOException e) {            e.printStackTrace();        }        return null;}

javaBean的封装

public class WebUtils {    public static <T> T fillFormBean(Class<T> clazz,HttpServletRequest request){        T t =null;        try {            t = clazz.newInstance();            BeanUtils.populate(t, request.getParameterMap());        } catch (Exception e) {            e.printStackTrace();        }        return t;    }} 

创建非指定长度的二维数组

            /*             *  为传递的参数,构建一个二维数组.             *  * 数组无论是一维还是二维数组,初始化时必须定义数组的长度.             *  * 虽然目前初始化二维数组时,可以定义该数组的长度(这种写法不具备通用性).             *  * 定义一个List集合的话,定义时是不需要初始化长度的.             *    * 利用一个List集合来替代二维数组,List集合包含的应该是一维数组:List<Object[]>             *    * 为每一次chongyu执行SQL语句传递参数时,需要一个一维数组.(再用一个List集合替代一维数组):List<Object>             *  * List集合转换成数组的方法:toArray()方法.             */            List<Object[]> list = new ArrayList<Object[]>();            for (Orderitem orderitem : items) {                // 一维数组表示一条SQL语句的所有参数                List<Object> item = new ArrayList<Object>();                item.add(orderitem.getOrder_id());                item.add(orderitem.getProduct_id());                item.add(orderitem.getBuynum());                list.add(item.toArray());            }            runner.batch(conn, sql2, list.toArray(new Object[0][]));  

动态代理的使用

1,对于没有实现接口的类:导入包:cglib

/**没有实现接口的类的动态代理(基于子类的动态代理,代理类是被代理类的子类) * @param args */public static void main(String[] args) {    final SpringBrother sb = new SpringBrother();    /*     * type:被代理的类型   callback  代理要做的事情     * 代理后是一个子类     */    SpringBrother s = (SpringBrother)Enhancer.create(SpringBrother.class, new MethodInterceptor() {        @Override        public Object intercept(Object obj, Method method, Object[] args,                MethodProxy arg3) throws Throwable {            if(method.getName().equals("sing")){                //如果唱歌,得按我的流程来                float money = (Float)args[0];                if(money>1000){                    Object retValue = method.invoke(sb, money/2);                    return retValue;                }            }else{                //如果不是唱歌,就直接执行                return method.invoke(sb, args);            }            return null;        }    });    s.sing(2000);//调用s的方法}

2,实现了接口的类的代理

final SpringBrother sb = new SpringBrother();//动态代理Human man = (Human)Proxy.newProxyInstance(sb.getClass().getClassLoader(), sb.getClass().getInterfaces(),        new InvocationHandler() {            /**             * proxy :代理人             * method:代理的方法             * args: 方法的参数             */            @Override            public Object invoke(Object proxy, Method method, Object[] args)                    throws Throwable {                if(method.getName().equals("sing")){                    //如果唱歌,得按我的流程来                    float money = (Float)args[0];                    if(money>1000){                        Object retValue = method.invoke(sb, money/2);                        return retValue;                    }                }else{                    //如果不是唱歌,就直接执行                    return method.invoke(sb, args);                }                return null;            }        });man.eat();//这个方法执行的时候:man对象传递给了invoke()方法中的proxy;eat()传给了method,
0 0
原创粉丝点击