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

响应式网站模板下载wordpress 小程序 插件

响应式网站模板下载,wordpress 小程序 插件,网站建设和管理情况自查报告,wordpress文章分类页目录一、反射1. 反射概念2. 反射的应用场景3. 反射机制的优缺点4. 反射实战获取 Class 对象的四种方式二、代理机制1. 代理模式2. 静态代理3. 动态代理3.1 JDK动态代理机制1. 介绍2.JDK 动态代理类使用步骤3. 代码示例3.2 CGLIB 动态代理机制1.介绍2.CGLIB 动态代理类使用步骤3… 目录一、反射1. 反射概念2. 反射的应用场景3. 反射机制的优缺点4. 反射实战获取 Class 对象的四种方式二、代理机制1. 代理模式2. 静态代理3. 动态代理3.1 JDK动态代理机制1. 介绍2.JDK 动态代理类使用步骤3. 代码示例3.2 CGLIB 动态代理机制1.介绍2.CGLIB 动态代理类使用步骤3. 代码示例3.3 JDK 动态代理和 CGLIB 动态代理对比4. 静态代理和动态代理的对比一、反射 1. 反射概念 反射之所以被称为框架的灵魂主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。 通过反射你可以获取任意一个类的所有属性和方法你还可以调用这些方法和属性 2. 反射的应用场景 像咱们平时大部分时候都是在写业务代码很少会接触到直接使用反射机制的场景。 但是这并不代表反射没有用。相反正是因为反射你才能这么轻松地使用各种框架。像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。 这些框架中也大量使用了动态代理而动态代理的实现也依赖反射。 比如下面是通过 JDK 实现动态代理的示例代码其中就使用了反射类 Method 来调用指定的方法。 public class DebugInvocationHandler implements InvocationHandler {/*** 代理类中的真实对象*/private final Object target;public DebugInvocationHandler(Object target) {this.target target;}public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {System.out.println(before method method.getName());Object result method.invoke(target, args);System.out.println(after method method.getName());return result;} }另外像 Java 中的一大利器 注解 的实现也用到了反射。 为什么你使用 Spring 的时候 一个Component注解就声明了一个类为 Spring Bean 呢为什么你通过一个 Value注解就读取到配置文件中的值呢究竟是怎么起作用的呢 这些都是因为你可以基于反射分析类然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后就可以做进一步的处理。 3. 反射机制的优缺点 优点 可以让咱们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利 缺点 让我们在运行时有了分析操作类的能力这同样也增加了安全问题。比如可以无视泛型参数的安全检查泛型参数的安全检查发生在编译时。另外反射的性能也要稍差点不过对于框架来说实际是影响不大的。相关阅读Java Reflection: Why is it so slow? 4. 反射实战 获取 Class 对象的四种方式 如果我们动态获取到这些信息我们需要依靠 Class对象Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象: 1. 知道具体类的情况下可以使用 Class alunbarClass TargetObject.class;但是我们一般是不知道具体类的基本都是通过遍历包下面的类来获取 Class 对象通过此方式获取 Class 对象不会进行初始化 2. 通过 Class.forName()传入类的全路径获取 Class alunbarClass1 Class.forName(cn.javaguide.TargetObject);3. 通过对象实例instance.getClass()获取 TargetObject o new TargetObject(); Class alunbarClass2 o.getClass();4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取: ClassLoader.getSystemClassLoader().loadClass(cn.javaguide.TargetObject);通过类加载器获取 Class 对象不会进行初始化意味着不进行包括初始化等一系列步骤静态代码块和静态对象不会得到执行 反射的一些基本操作 1.创建一个我们要使用反射操作的类 TargetObject package cn.javaguide;public class TargetObject {private String value;public TargetObject() {value JavaGuide;}public void publicMethod(String s) {System.out.println(I love s);}private void privateMethod() {System.out.println(value is value);} } 使用反射操作这个类的方法以及参数 package cn.javaguide;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {/*** 获取 TargetObject 类的 Class 对象并且创建 TargetObject 类实例*/Class? targetClass Class.forName(cn.javaguide.TargetObject);TargetObject targetObject (TargetObject) targetClass.newInstance();/*** 获取 TargetObject 类中定义的所有方法*/Method[] methods targetClass.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName());}/*** 获取指定方法并调用*/Method publicMethod targetClass.getDeclaredMethod(publicMethod,String.class);publicMethod.invoke(targetObject, JavaGuide);/*** 获取指定参数并对参数进行修改*/Field field targetClass.getDeclaredField(value);//为了对类中的参数进行修改我们取消安全检查field.setAccessible(true);field.set(targetObject, JavaGuide);/*** 调用 private 方法*/Method privateMethod targetClass.getDeclaredMethod(privateMethod);//为了调用private方法我们取消安全检查privateMethod.setAccessible(true);privateMethod.invoke(targetObject);} } 输出内容 publicMethod privateMethod I love JavaGuide value is JavaGuide二、代理机制 1. 代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问这样就可以在不修改原目标对象的前提下提供额外的功能操作扩展目标对象的功能。 代理模式的主要作用是扩展目标对象的功能比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。 举个例子新娘找来了自己的姨妈来代替自己处理新郎的提问新娘收到的提问都是经过姨妈处理过滤之后的。姨妈在这里就可以看作是代理你的代理对象代理的行为方法是接收和回复新郎的提问。 代理模式有静态代理和动态代理两种实现方式 2. 静态代理 静态代理中我们对目标对象的每个方法的增强都是手动完成的非常不灵活比如接口一旦新增加方法目标对象和代理对象都要进行修改且麻烦(需要对每个目标类都单独写一个代理类。 实际应用场景非常非常少日常开发几乎看不到使用静态代理的场景。 上面我们是从实现和应用角度来说的静态代理从 JVM 层面来说 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。 静态代理实现步骤: 定义一个接口及其实现类创建一个代理类同样实现这个接口将目标对象注入进代理类然后在代理类的对应方法调用目标类中的对应方法。这样的话我们就可以通过代理类屏蔽对目标对象的访问并且可以在目标方法执行前后做一些自己想做的事情。 通过代码展示 1. 定义发送短信的接口 public interface SmsService {String send(String message); }2. 实现发送短信的接口 public class SmsServiceImpl implements SmsService {public String send(String message) {System.out.println(send message: message);return message;} }3. 创建代理类并同样实现发送短信的接口 public class SmsProxy implements SmsService {private final SmsService smsService;public SmsProxy(SmsService smsService) {this.smsService smsService;}Overridepublic String send(String message) {//调用方法之前我们可以添加自己的操作System.out.println(before method send());smsService.send(message);//调用方法之后我们同样可以添加自己的操作System.out.println(after method send());return null;} } 实际应用 public class Main {public static void main(String[] args) {SmsService smsService new SmsServiceImpl();SmsProxy smsProxy new SmsProxy(smsService);smsProxy.send(java);} }运行上述代码之后控制台打印出 before method send() send message:java after method send()可以输出结果看出我们已经增加了 SmsServiceImpl 的send()方法 3. 动态代理 相比于静态代理来说动态代理更加灵活。我们不需要针对每个目标类都单独创建一个代理类并且也不需要我们必须实现接口我们可以直接代理实现类( CGLIB 动态代理机制)。 从 JVM 角度来说动态代理是在运行时动态生成类字节码并加载到 JVM 中的。 说到动态代理Spring AOP、RPC 框架应该是两个不得不提的它们的实现都依赖了动态代理。 动态代理在我们日常开发中使用的相对较少但是在框架中的几乎是必用的一门技术。学会了动态代理之后对于我们理解和学习各种框架的原理也非常有帮助。 就 Java 来说动态代理的实现方式有很多种比如 JDK 动态代理、CGLIB 动态代理等等。 3.1 JDK动态代理机制 1. 介绍 在 Java 动态代理机制中 InvocationHandler接口和 Proxy 类是核心 Proxy类中使用频率最高的方法是newProxyInstance()这个方法主要用来生成一个代理对象 public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)throws IllegalArgumentException{......} 这个方法一共有 3 个参数 loader :类加载器用于加载代理对象。interfaces : 被代理类实现的一些接口h : 实现了 InvocationHandler 接口的对象 要实现动态代理的话还必须需要实现InvocationHandler 来自定义处理逻辑。 当我们的动态代理对象调用一个方法时这个方法的调用就会被转发到实现InvocationHandler 接口类的 invoke 方法来调用 public interface InvocationHandler {/*** 当你使用代理对象调用方法的时候实际会调用到这个方法*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable; } 要实现动态代理的话还必须需要实现InvocationHandler 来自定义处理逻辑。 当我们的动态代理对象调用一个方法时这个方法的调用就会被转发到实现InvocationHandler 接口类的 invoke 方法来调用 public interface InvocationHandler {/*** 当你使用代理对象调用方法的时候实际会调用到这个方法*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable; } invoke() 方法有下面三个参数 proxy :动态生成的代理类method : 与代理类对象调用的方法相对应args : 当前 method 方法的参数 也就是说你通过Proxy 类的 newProxyInstance() 创建的代理对象在调用方法的时候实际会调用到实现InvocationHandler 接口的类的 invoke()方法。 你可以在 invoke() 方法中自定义处理逻辑比如在方法执行前后做什么事情。 2.JDK 动态代理类使用步骤 定义一个接口及其实现类自定义 InvocationHandler 并重写invoke方法在invoke方法中我们会调用原生方法被代理类的方法并自定义一些处理逻辑通过 Proxy.newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h) 方法创建代理对象 3. 代码示例 定义发送短信的接口 public interface SmsService {String send(String message); }实现发送短信的接口 public class SmsServiceImpl implements SmsService {public String send(String message) {System.out.println(send message: message);return message;} }定义一个 JDK 动态代理类 import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** author shuang.kou* createTime 2020年05月11日 11:23:00*/ public class DebugInvocationHandler implements InvocationHandler {/*** 代理类中的真实对象*/private final Object target;public DebugInvocationHandler(Object target) {this.target target;}public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {//调用方法之前我们可以添加自己的操作System.out.println(before method method.getName());Object result method.invoke(target, args);//调用方法之后我们同样可以添加自己的操作System.out.println(after method method.getName());return result;} } invoke() 方法: 当我们的动态代理对象调用原生方法的时候最终实际上调用到的是 invoke() 方法然后 invoke() 方法代替我们去调用了被代理对象的原生方法 获取代理对象的工厂类 public class JdkProxyFactory {public static Object getProxy(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(), // 目标类的类加载target.getClass().getInterfaces(), // 代理需要实现的接口可指定多个new DebugInvocationHandler(target) // 代理对象对应的自定义 InvocationHandler);} }getProxy() 主要通过Proxy.newProxyInstance()方法获取某个类的代理对象 实际使用 SmsService smsService (SmsService) JdkProxyFactory.getProxy(new SmsServiceImpl()); smsService.send(java);运行上述代码之后控制台打印出 before method send send message:java after method send3.2 CGLIB 动态代理机制 1.介绍 JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类。 为了解决这个问题我们可以用 CGLIB 动态代理机制来避免。 CGLIB(Code Generation Library)是一个基于ASM的字节码生成库它允许我们在运行时对字节码进行修改和动态生成。CGLIB 通过继承方式实现代理。很多知名的开源框架都使用到了CGLIB 例如 Spring 中的 AOP 模块中如果目标对象实现了接口则默认采用 JDK 动态代理否则采用 CGLIB 动态代理。 在 CGLIB 动态代理机制中MethodInterceptor接口和Enhancer类是核心。 你需要自定义 MethodInterceptor 并重写intercept方法intercept 用于拦截增强被代理类的方法。 public interface MethodInterceptor extends Callback{// 拦截被代理类中的方法public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable; } obj : 被代理的对象需要增强的对象method : 被拦截的方法需要增强的方法args : 方法入参proxy : 用于调用原始方法 你可以通过 Enhancer类来动态获取被代理类当代理类调用方法的时候实际调用的是 MethodInterceptor 中的 intercept 方法 2.CGLIB 动态代理类使用步骤 定义一个类自定义 MethodInterceptor 并重写 intercept 方法intercept 用于拦截增强被代理类的方法和 JDK 动态代理中的 invoke 方法类似通过 Enhancer 类的 create()创建代理类 3. 代码示例 不同于 JDK 动态代理不需要额外的依赖。CGLIB(Code Generation Library) 实际是属于一个开源项目如果你要使用它的话需要手动添加相关依赖 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version /dependency 实现一个发送短信的类 package github.javaguide.dynamicProxy.cglibDynamicProxy;public class AliSmsService {public String send(String message) {System.out.println(send message: message);return message;} }自定义 MethodInterceptor方法拦截器 import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** 自定义MethodInterceptor*/ public class DebugMethodInterceptor implements MethodInterceptor {/*** param o 被代理的对象需要增强的对象* param method 被拦截的方法需要增强的方法* param args 方法入参* param methodProxy 用于调用原始方法*/Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {//调用方法之前我们可以添加自己的操作System.out.println(before method method.getName());Object object methodProxy.invokeSuper(o, args);//调用方法之后我们同样可以添加自己的操作System.out.println(after method method.getName());return object;}} 获取代理类 import net.sf.cglib.proxy.Enhancer;public class CglibProxyFactory {public static Object getProxy(Class? clazz) {// 创建动态代理增强类Enhancer enhancer new Enhancer();// 设置类加载器enhancer.setClassLoader(clazz.getClassLoader());// 设置被代理类enhancer.setSuperclass(clazz);// 设置方法拦截器enhancer.setCallback(new DebugMethodInterceptor());// 创建代理类return enhancer.create();} } 实际使用 AliSmsService aliSmsService (AliSmsService) CglibProxyFactory.getProxy(AliSmsService.class); aliSmsService.send(java); 运行上述代码之后控制台打印出 before method send send message:java after method send3.3 JDK 动态代理和 CGLIB 动态代理对比 JDK 动态代理只能代理实现了接口的类或者直接代理接口而 CGLIB 可以代理未实现任何接口的类。 另外 CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用因此不能代理声明为 final 类型的类和方法。就二者的效率来说大部分情况都是 JDK 动态代理更优秀随着 JDK 版本的升级这个优势更加明显。 4. 静态代理和动态代理的对比 灵活性 动态代理更加灵活不需要必须实现接口可以直接代理实现类并且可以不需要针对每个目标类都创建一个代理类。另外静态代理中接口一旦新增加方法目标对象和代理对象都要进行修改这是非常麻烦的JVM 层面 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。而动态代理是在运行时动态生成类字节码并加载到 JVM 中的。
http://www.w-s-a.com/news/239903/

相关文章:

  • 一个网站做两个优化可以做吗永清网站建设
  • wordpress英文采集wordpress seo 链接
  • 进入建设银行的网站就打不了字工程建设标准化网站
  • 杭州网站推广大全网站建设演讲稿
  • 厦门网站的制作太仓专业网站建设
  • 天津公司网站建设公司哪家好在阿里巴巴国际网站上需要怎么做
  • 网站关键词seo推广公司哪家好无锡市无锡市住房和城乡建设局网站
  • 开远市新农村数字建设网站网站如何做QQ登录
  • 自己做个网站教程高端网站开发哪家强
  • 网站模板免费下载中文版大连网站建设哪家专业
  • 网站建设的基本代理公司注册公司坑人
  • 企业网站被黑后如何处理wordpress邮件发送类
  • 北京网站的网站建设公司建设工程竣工验收消防备案网站
  • 淄博市 网站建设报价wordpress里的发消息给我
  • 网站下拉菜单怎么做游戏网站模板免费下载
  • 阿里云上做网站套模板怎么做一个网站开发小组
  • 营销型网站源码下载青岛做网站建设的公司哪家好
  • 迁西网站定制怎么制作网址内容
  • 深圳装饰公司网站宁波网站建设哪里有
  • 建站网站破解版怎么看自己的网站是用什么做的
  • 做微商那个网站好织梦模板更新网站
  • 网站注册表单怎么做手机做网站需要多少天
  • 书店商城网站html模板下载企业网站建设方案书范文
  • 建设网站是普通办公吗快速排名seo软件
  • 大型外贸网站建设网站建设图片尺寸要求
  • 网站建设可信赖北京网站开发月薪
  • 专门做lolh的网站wordpress 模版 cho's
  • 网上做设计兼职哪个网站好点网站开发毕业周记
  • 自学商城网站建设无为网页定制
  • wordpress全站cdn手机网站调用分享