高薪技术知识(4)
来源:互联网 发布:json与xml的比较 编辑:程序博客网 时间:2024/05/16 00:41
代理的概念与作用
AOP
动态代理技术
5.0、创建动态类及查看其方法列表信息
分析JVM动态生成的类
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()); }}
5.3、分析InvocationHandler对象的运行原理
猜想分析动态生成的类的内部代码
5.4、总结分析动态代理类的设计原理与结构
让动态生成类称为目标类的代理
画圈的log()表示一个对象中的log()方法。
以下就为之前代理类对象生成方式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(); }}
接口:
5.6、实现类似spring的可配置的AOP框架package cn.itcast.day3;import java.lang.reflect.Method;public interface Advice { void beforeMethod(Method method); void afterMethod(Method method);}
实现AOP功能的封装与配置
类工厂BeanFactory:
ProxyFactoryBean类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; }}
接口Advicepackage 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; }}
MyAdvice类package cn.itcast.day3;import java.lang.reflect.Method;public interface Advice { void beforeMethod(Method method); void afterMethod(Method method);}
测试类: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(); }}
config.properties配置文件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(); }}
#xxx=java.util.ArrayListxxx=cn.itcast.day3.aopframework.ProxyFactoryBeanxxx.advice=cn.itcast.day3.MyAdvicexxx.target=java.util.ArrayList
- 高薪技术知识(4)
- 高薪技术知识(2)
- 高薪技术知识(3)
- 高薪技术
- Java高薪技术
- [转]技术等于高薪?
- 高薪技术排行
- 黑马程序员----高薪技术(JavaBean)
- 黑马程序员_高薪技术
- 黑马程序员--高薪技术--反射
- java基础--高薪技术--反射
- 黑马程序员_高薪技术_7
- 黑马程序员_高薪技术_9
- 黑马程序员_高薪技术笔记
- 黑马程序员-java基础06高薪技术
- 黑马程序员_高薪技术(一)
- 黑马程序员_高薪技术(二)
- 黑马程序员-----高薪技术(反射)
- ubuntu64位下web开发工具sublime Text2的下载安装命令
- 放慢语速可缓解焦虑
- 你必须了解的DevOps 10大热门趋势
- 滚动文字
- 关于PreparedStatement你知道多少
- 高薪技术知识(4)
- SQL根据员工权限查询素材
- timerfd
- 写一个算法计算n的阶乘末尾0的个数
- deep learning in NLP—深度学习在自然语言处理中的应用—入门学习序列
- Oracle 10g安装时出现Configuration Assistant安装失败
- Hadoop 高级程序设计(二)---自定义输入输出格式
- 腾讯2015届校招面经,止步复试
- [LeetCode]Sum Root to Leaf Numbers