当前位置: 首页 > news >正文

网站建设原则包括哪些方面百度百科官网

网站建设原则包括哪些方面,百度百科官网,js多久可以做网站,全国广告投放平台代理模式 1. 代理模式 概念2. 静态代理3. 动态代理3.1.JDK动态代理3.2.CGLIB动态代理3.3. JDK动态代理和CGLIB动态代理区别 4.静态代理和动态代理区别5.篇末 1. 代理模式 概念 代理模式是一种设计模式。 使用代理对象来替代真实对象#xff0c;用代理对象去访问目标对象。这样… 代理模式 1. 代理模式 概念2. 静态代理3. 动态代理3.1.JDK动态代理3.2.CGLIB动态代理3.3. JDK动态代理和CGLIB动态代理区别 4.静态代理和动态代理区别5.篇末 1. 代理模式 概念 代理模式是一种设计模式。 使用代理对象来替代真实对象用代理对象去访问目标对象。这样可以保证在不修改目标对象的前提下还可以增加一些额外的功能作出扩展。 代理模式的作用主要是扩展目标对象的功能在目标对象执行方法的前后可以自己自定义一些操作。 同时代理模式分为静态代理和动态代理 2. 静态代理 静态代理对目标对象的方法增强要手动完成如果接口增加了新的方法那么就要更改代码不够灵活开发中比较少见静态代理。 JVM层面: 静态代理在编译期讲接口和接口的实现类代理类都变成class文件。 静态代理实现 1. 定义接口A和实现类 (也就是要传输的内容) 2. 创建一个代理类实现接口A (代理类要可以接收传输的内容) 3. 将目标对象注入到代理类中在代理类的方法中调用目标对象的方法然后在目标对象方法执行的前后 就可以扩展一些内容。 代码 1.定义发送内容的接口 package 静态代理;// 1.定义发送内容的接口 目标对象 public interface Message {String send(String message); } 2.实现发送短信的接口 package 静态代理;//2. 发送内容接口的实现类 就是目标对象处理传输的内容的处理方法 public class MessageImpl implements Message {Overridepublic String send(String message) {System.out.println(send message: message);return message;} } 3.创建代理类并实现接口 package 静态代理;//3. 代理类 也需要实现接口 且需要将目标对象注入到其中来 代理对象 public class MessageProxy implements Message {//目标对象(Message)注入到代理类中private final Message Message;public MessageProxy(Message message) {this.Message message;}Overridepublic String send(String message) {//方法执行前 添加自定义内容System.out.println(before method send());//在代理类中的方法 调用目标类的方法Message.send(message);//方法执行后 添加自定义内容System.out.println(after method send());return null;} } 4.执行代码 public class Main {public static void main(String[] args) {System.out.println(静态代理);//实例化 实现类对象 类型是Message 目标对象//Message sendMessage new MessageImpl();MessageImpl sendMessage new MessageImpl();//实例化 代理类对象 完成注入 代理对象MessageProxy messageProxy new MessageProxy(sendMessage);//执行方法messageProxy.send(hello);} }3. 动态代理 对于静态代理来说动态代理更加灵活不需要保证每个目标类都有一个代理类实现接口也不是必须的可以直接代理实现类。 JVM层面 动态代理是在运行时动态生成类字节码加载到JVM中。 举例 Spring AOP RPC框架使用了动态代理。 动态代理对于框架的学习帮助较大。 动态代理实现方法很多 这篇介绍 JDK动态代理和CGLIB动态代理。 3.1.JDK动态代理 JDK动态代理中 InvocationHandler接口和Proxy类是重点。 Proxy类中有一个方法newProxyInstance() 用来生成代理对象。 public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)throws IllegalArgumentException{......} Proxy类中的newProxyInstance()方法有三个参数 1.loader类加载器用来加载代理对象。 2.interfaces: 被代理类实现的一些接口。 3.h: 实现了InvocationHandler接口的对象。 动态代理还需要实现InvocationHandler接口自定义处理内容的逻辑这样我们在代理对象调用一个方法的时候方法会转发到InvocationHandler接口类中的invoke方法。 public interface InvocationHandler {/*** 当你使用代理对象调用方法的时候实际会调用到这个方法*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable; } InvocationHandler接口中的invock方法有三个参数 **1.proxy**动态生成的代理类。 **2.method**与代理类调用的方法对应 **3.args**method方法的参数 动态代理机制通过Proxy类的newProxyInstance方法 创建的代理类在调用方法的时候实际调用的InvocationHandler接口中的Invoke方法。 所以需要在Invoke方法中自定义内容。 JDK动态代理实现: 1.定义一个接口和实现类 2.重写InvocationHandler中的Invoke()方法用来自定义内容。 3.通过Proxy类的newProxyInstance()方法创建代理对象。 代码 1.定义发送内容的接口 package JDK动态代理; //目标对象 public interface SdMessage {String send(String message); } 2.发送内容接口的实现类 package JDK动态代理; //实现接口的实现类 就是目标对象处理传输的内容的处理方法 public class SdMessageImp implements SdMessage {Overridepublic String send(String message) {System.out.println(send message: message);return message;} } 3.重写InvocationHandler中的Invoke方法 package JDK动态代理;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //代理类调用方法时 调用的是InvocationHandler中的Invoke方法 重写它 自定义 public class MyInvocationHandler implements InvocationHandler {/*** 代理类中的真实对象*/private final Object target;public MyInvocationHandler(Object target) {this.target target;}//其中的method和代理类调用的方法对应Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法调用前自定义的内容System.out.println(before method() method.getName());Object result method.invoke(target,args);//方法调用后自定义的内容System.out.println(after method() method.getName());return result;} } 4.创建代理类 package JDK动态代理;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //代理类调用方法时 调用的是InvocationHandler中的Invoke方法 重写它 自定义 public class MyInvocationHandler implements InvocationHandler {/*** 代理类中的真实对象*/private final Object target;public MyInvocationHandler(Object target) {this.target target;}//其中的method和代理类调用的方法对应Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法调用前自定义的内容System.out.println(before method() method.getName());Object result method.invoke(target,args);//方法调用后自定义的内容System.out.println(after method() method.getName());return result;} } 5.执行 public class Main {public static void main(String[] args) {//JDK动态代理 其中的参数是目标对象System.out.println(JDK动态代理);SdMessage sdMessage (SdMessage) ProxyFactory.getProxy(new SdMessageImp());sdMessage.send(hello);} } 3.2.CGLIB动态代理 JDK动态代理的缺点是 只可以代理已经实现了接口的实现类。 而CGLIB动态代理可以避免。 CGLIB是一个基于ASM的字节码生成库允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理很多开源框架都使用到了CGLIB例如Spring中的AOP模块中如果实现了接口那么就采用JDK动态代理如果没实现就使用CGLIB动态代理。 CGLIB动态代理中 MethodInterceptor接口和Enhancer类是重点 需要重写MethodInterceptor接口中的Intercept方法这个方法用来拦截被代理类。 public interface MethodInterceptor extends Callback{// 拦截被代理类中的方法public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable; } **MethodInterceptor接口中的Intercept()**方法有4个参数 1.obj被代理的对象(也可以叫做需要增强的对象) 2.method:被拦截的方法(也可以叫做需要增强的方法) 3.args方法的参数 4.proxy:用于调用原始方法 可以通过Enhancer类来动态获取被代理类当代理类调用方法的时候实际调用的是MethodInterceptor接口中的Intercept方法。 CGLIB动态代理实现: 1.定义一个类 2.重写MethodInterceptor接口中的Intercept()方法这个方法用来拦截被代理类的方法其实也就是拦截到方法以后会执行intercept方法和被代理类的方法。 3.通过Enhancer类的create()方法创建代理类。 CGLIB动态代理代码实现 CGLIB是开源项目需要引入依赖。 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version /dependency 1.实现一个发送消息的类 package CGLIB动态代理;//发送内容的类 public class CglibSdMessage {public String send(String message) {System.out.println(send message: message);return message;} } 2.自定义MethodInterceptor(方法拦截器)重写其中的Intercept方法 package CGLIB动态代理;import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;//方法拦截器 重写MethodInterceptor接口中的intercept方法 public class MyMethodInterceptor implements MethodInterceptor {/**** param o 被代理的对象(需要增强的对象)* param method 被拦截的方法(需要增强的方法)* param objects 方法的参数* param methodProxy 用于调用原始方法* return* throws Throwable*/Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//方法调用前自定义的内容System.out.println(before method() method.getName());Object object methodProxy.invokeSuper(o,objects);//方法调用后自定义的内容System.out.println(after method() method.getName());return object;} }3.获取代理类创建代理类 package CGLIB动态代理;import net.sf.cglib.proxy.Enhancer;//创建代理类 通过Enhancer类的create方法 public class CglibProxyFactory {//Class? clazz之前接收的是实现接口的实现类 现在接收的是类 泛型public static Object getProxy(Class? clazz) {//创建动态代理类Enhancer enhancer new Enhancer();//设置类加载器enhancer.setClassLoader(clazz.getClass().getClassLoader());//设置被代理类目标对象enhancer.setSuperclass(clazz);//设置方法拦截器enhancer.setCallback(new MyMethodInterceptor());//创建代理类return enhancer.create();} } 4.调用 public class Main {public static void main(String[] args) {//CGLIB动态代理 其中的参数是被代理类(目标对象)System.out.println(JDK动态代理);CglibSdMessage cglibSdMessage (CglibSdMessage) CglibProxyFactory.getProxy(CglibSdMessage.class);cglibSdMessage.send(hello);} } 3.3. JDK动态代理和CGLIB动态代理区别 JDK动态代理只能代理已经实现了接口的类CGLIB动态代理可以直接代理没有实现接口的(CGLIB动态代理通过生成一个被代理类的子类来拦截被代理类中的方法调用因为是继承所以不能代理被final修饰的类和方法)JDK动态代理的效率更高。 4.静态代理和动态代理区别 灵活性动态代理更加的灵活接口的实现不是必要的CGLIB动态代理可以直接代理一个类。静态代理只能代理实现了接口的类并且接口增加新方法的时候目标对象的代码和代理对象的代码都要修改。JVM静态代理在编译期就把接口实现类代理类变成Class文件动态代理在运行时动态生成类字节码文件加载到JVM中。 5.篇末 我在文章中介绍了静态代理和动态代理包阔了静态代理的代码实现和动态代理中的2钟代理(JDK动态代理和CGLIB动态代理)的代码实现已经静/动态代理的区别和两种动态代理的区别。
http://www.yutouwan.com/news/32667/

相关文章:

  • 网站建设后台需要什么技术制作很好的网站
  • 网站建设的报告h5网页是什么意思
  • 湖北省节能建设网站退役厅门户网站建设中标公告
  • 品牌展示设计网站优质专业建设申报网站
  • 哪些网站可以做微商企业申报系统
  • 杭州网站免费制作wordpress新站注意事项
  • 网站的网络营销方案健身网站开发项目总结
  • html做网站怎么链接音乐太原网站建设培训学校
  • 免费在线代理网站网络设计接单
  • 什么是网站建设中的目录wordpress主题next推荐
  • 学校部门网站的建设深圳ui设计
  • 陕西省建设网站查询证件相片建设协会网站
  • 宁波免费做网站如何做网站menu菜单
  • 广州万安建设监理有限公司网站wordpress 插件 原理
  • 做网站需要域名吗wordpress媒体库 插件
  • 福州做网站的网站字体只能用
  • 中铁建设集团门户网站登陆同城引流用什么软件
  • 自己做网站的公司宁波正规优化seo公司
  • 做电商网站需要多少时间如何提升学历
  • 低价手机网站建设计算机网页设计实训报告
  • 做电脑游戏破解的网站建网站和app
  • 如何自己建造网站世界十大网站排名
  • 郑州网站设计培训广州seo排名外包
  • 石家庄建网站硬件工程师和软件工程师的区别
  • 做视频网站要注意什么企业门户网站设计论文
  • 网站外推和优化绍兴cms建站系统
  • 怎么把电脑网站做服务器吗网站首页结构布局
  • 数据交易网站源码查失信被执行人名单查询
  • 西城做网站个人网站的设计和建设
  • 深圳装修公司网站室内设计师排名