高薪技术知识(4)

来源:互联网 发布:json与xml的比较 编辑:程序博客网 时间:2024/05/16 00:41
4.9、分析代理类的作用与原理及AOP概念
代理的概念与作用
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 AOP
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 动态代理技术
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 

5.0、创建动态类及查看其方法列表信息
分析JVM动态生成的类
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 
 

package cn.itcast.day3;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ProxyTest {    /**     * @param args     */    public static void main(String[] args) throws Exception{        Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);        System.out.println(clazzProxy1.getName());                System.out.println("----------begin constructors list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Constructor[] constructors = clazzProxy1.getConstructors();        for(Constructor constructor : constructors){            String name = constructor.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = constructor.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }        System.out.println("----------begin methods list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Method[] methods = clazzProxy1.getMethods();        for(Method method : methods){            String name = method.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = method.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }    }}    


5.1、创建动态类的实例对象及调用其方法

package cn.itcast.day3;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ProxyTest {    /**     * @param args     */    public static void main(String[] args) throws Exception{        // TODO Auto-generated method stub        Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);        System.out.println(clazzProxy1.getName());                System.out.println("----------begin constructors list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Constructor[] constructors = clazzProxy1.getConstructors();        for(Constructor constructor : constructors){            String name = constructor.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = constructor.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }        System.out.println("----------begin methods list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Method[] methods = clazzProxy1.getMethods();        for(Method method : methods){            String name = method.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = method.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }                System.out.println("----------begin create instance object----------");        //Object obj = clazzProxy1.newInstance();        Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);        class MyInvocationHander1 implements InvocationHandler{            public Object invoke(Object proxy, Method method, Object[] args)                    throws Throwable {                // TODO Auto-generated method stub                return null;            }                }        Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1());                System.out.println(proxy1);        proxy1.clear();        //proxy1.size();        //System.out.println("111111111111111");    }}



5.2、完成InvocationHandler对象的内部功能

import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ProxyTest {    /**     * @param args     */    public static void main(String[] args) throws Exception{        // TODO Auto-generated method stub        Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);        System.out.println(clazzProxy1.getName());                System.out.println("----------begin constructors list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Constructor[] constructors = clazzProxy1.getConstructors();        for(Constructor constructor : constructors){            String name = constructor.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = constructor.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }        System.out.println("----------begin methods list----------");        /*$Proxy0()        $Proxy0(InvocationHandler,int)*/        Method[] methods = clazzProxy1.getMethods();        for(Method method : methods){            String name = method.getName();            StringBuilder sBuilder = new StringBuilder(name);            sBuilder.append('(');            Class[] clazzParams = method.getParameterTypes();            for(Class clazzParam : clazzParams){                sBuilder.append(clazzParam.getName()).append(',');            }            if(clazzParams!=null && clazzParams.length != 0)                sBuilder.deleteCharAt(sBuilder.length()-1);            sBuilder.append(')');            System.out.println(sBuilder.toString());                    }                System.out.println("----------begin create instance object----------");        //Object obj = clazzProxy1.newInstance();        Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);        class MyInvocationHander1 implements InvocationHandler{            public Object invoke(Object proxy, Method method, Object[] args)                    throws Throwable {                // TODO Auto-generated method stub                return null;            }                }        Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1());                System.out.println(proxy1);        proxy1.clear();        //proxy1.size();        //System.out.println("111111111111111");                Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){            public Object invoke(Object proxy, Method method, Object[] args)                    throws Throwable {                return null;            }                    });        Collection proxy3 = (Collection)Proxy.newProxyInstance(        Collection.class.getClassLoader(),        new Class[]{Collection.class},        new InvocationHandler(){            ArrayList target = new ArrayList();            public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{            //ArrayList target = new ArrayList();            long beginTime = System.currentTimeMillis();            Object retVal = method.invoke(target,args);            long endTime = System.currentTimeMillis();            System.out.println(method.getName()+"running time of"+(endTime - beginTime));            return retVal;            }        });        proxy3.add("zzz");        proxy3.add("xxx");        proxy3.add("yyy");        System.out.println(proxy3.size());            }}

输出结果:
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 
5.3、分析InvocationHandler对象的运行原理

猜想分析动态生成的类的内部代码
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 

5.4、总结分析动态代理类的设计原理与结构

让动态生成类称为目标类的代理
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
 画圈的log()表示一个对象中的log()方法。
Java高新技术学习总结(4) - faith_yee - faith_yee的博客
以下就为之前代理类对象生成方式3改进。

5.5、编写可生成代理和插入通告的通用方法

 import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ProxyTest {    /**     * @param args     */    public static void main(String[] args) throws Exception{ //模块化后的代理类的使用案例        final ArrayList target = new ArrayList();                    Collection proxy3 = (Collection)getProxy(target,new MyAdvice());        proxy3.add("zxx");        proxy3.add("lhm");        proxy3.add("bxd");        System.out.println(proxy3.size());        System.out.println(proxy3.getClass().getName());    } //被封装好的接收代理类的方法,并把实现好的接口传入到方法里,这样方法里就可以调用接口实现好的方法    private static Object getProxy(final Object target,final Advice advice) {        Object proxy3 = Proxy.newProxyInstance(                target.getClass().getClassLoader(),                /*new Class[]{Collection.class},*/                target.getClass().getInterfaces(),                new InvocationHandler(){                                    public Object invoke(Object proxy, Method method, Object[] args)                            throws Throwable { //用来对比的原来没模块化的代码                        /*long beginTime = System.currentTimeMillis();                        Object retVal = method.invoke(target, args);                        long endTime = System.currentTimeMillis();                        System.out.println(method.getName() + " running time of " + (endTime - beginTime));                        return retVal;*/                                                advice.beforeMethod(method);                        Object retVal = method.invoke(target, args);                        advice.afterMethod(method);                        return retVal;                                                                    }                }                );        return proxy3;    }}

实现接口并用来传入到封装好的接收代理类的方法里

package cn.itcast.day3;import java.lang.reflect.Method;public class MyAdvice implements Advice {    long beginTime = 0;    public void afterMethod(Method method) {        // TODO Auto-generated method stub        System.out.println("从传智播客毕业上班啦!");                long endTime = System.currentTimeMillis();        System.out.println(method.getName() + " running time of " + (endTime - beginTime));    }    public void beforeMethod(Method method) {        // TODO Auto-generated method stub        System.out.println("到传智播客来学习啦!");        beginTime = System.currentTimeMillis();    }}


接口:

package cn.itcast.day3;import java.lang.reflect.Method;public interface Advice {    void beforeMethod(Method method);    void afterMethod(Method method);}

5.6、实现类似spring的可配置的AOP框架
实现AOP功能的封装与配置

Java高新技术学习总结(4) - faith_yee - faith_yee的博客
类工厂BeanFactory:

package cn.itcast.day3.aopframework;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import cn.itcast.day3.Advice;public class BeanFactory {    Properties props = new Properties();    public BeanFactory(InputStream ips){        try {            props.load(ips);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }        public Object getBean(String name){        String className = props.getProperty(name);        Object bean = null;        try {            Class clazz = Class.forName(className);            bean = clazz.newInstance();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }         if(bean instanceof ProxyFactoryBean){            Object proxy = null;            ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;            try {                Advice advice = (Advice)Class.forName(props.getProperty(name + ".advice")).newInstance();                Object target = Class.forName(props.getProperty(name + ".target")).newInstance();                proxyFactoryBean.setAdvice(advice);                proxyFactoryBean.setTarget(target);                proxy = proxyFactoryBean.getProxy();            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            return proxy;        }        return bean;    }}

ProxyFactoryBean类

package cn.itcast.day3.aopframework;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import cn.itcast.day3.Advice;public class ProxyFactoryBean {    private Advice advice;    private Object target;        public Advice getAdvice() {        return advice;    }    public void setAdvice(Advice advice) {        this.advice = advice;    }    public Object getTarget() {        return target;    }    public void setTarget(Object target) {        this.target = target;    }    public Object getProxy() {        // TODO Auto-generated method stub        Object proxy3 = Proxy.newProxyInstance(                target.getClass().getClassLoader(),                /*new Class[]{Collection.class},*/                target.getClass().getInterfaces(),                new InvocationHandler(){                                    public Object invoke(Object proxy, Method method, Object[] args)                            throws Throwable {                        /*long beginTime = System.currentTimeMillis();                        Object retVal = method.invoke(target, args);                        long endTime = System.currentTimeMillis();                        System.out.println(method.getName() + " running time of " + (endTime - beginTime));                        return retVal;*/                                                advice.beforeMethod(method);                        Object retVal = method.invoke(target, args);                        advice.afterMethod(method);                        return retVal;                                                                    }                }                );        return proxy3;    }}

接口Advice

package cn.itcast.day3;import java.lang.reflect.Method;public interface Advice {    void beforeMethod(Method method);    void afterMethod(Method method);}

MyAdvice类

package cn.itcast.day3;import java.lang.reflect.Method;public class MyAdvice implements Advice {    long beginTime = 0;    public void afterMethod(Method method) {        // TODO Auto-generated method stub        System.out.println("从传智播客毕业上班啦!");                long endTime = System.currentTimeMillis();        System.out.println(method.getName() + " running time of " + (endTime - beginTime));    }    public void beforeMethod(Method method) {        // TODO Auto-generated method stub        System.out.println("到传智播客来学习啦!");        beginTime = System.currentTimeMillis();    }}

测试类:

package cn.itcast.day3.aopframework;import java.io.InputStream;import java.util.Collection;public class AopFrameworkTest {    /**     * @param args     */    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");        Object bean = new BeanFactory(ips).getBean("xxx");        System.out.println(bean.getClass().getName());        ((Collection)bean).clear();    }}

config.properties配置文件

#xxx=java.util.ArrayListxxx=cn.itcast.day3.aopframework.ProxyFactoryBeanxxx.advice=cn.itcast.day3.MyAdvicexxx.target=java.util.ArrayList

0 0