最近在研究RPC框架,避免不了的就是在RPC调用中使用最多的则是动态代理的机制了,基于此,我们先来研究一下JDK动态代理

我们先来尝试着编写一下JDK动态代理的代码

1. 由于JDK动态代理是基于接口的,所以不免需要先编写一个接口,并声明一个getHello方法

package cn.lonecloud.study.service;

import cn.lonecloud.study.dto.HelloDto;

/**
* @author lonecloud
* @version v1.0
* @Package cn.lonecloud.study
* @Description: TODO
* @date 2018/6/8下午4:36
*/
public interface HelloService { HelloDto getHello(String name);
}

2. 有了接口,肯定是需要实现类,并将getHello方法给予实现

package cn.lonecloud.study;

import cn.lonecloud.study.dto.HelloDto;
import cn.lonecloud.study.service.HelloService; /**
* @author lonecloud
* @version v1.0
* @Package cn.lonecloud.study
* @Description: TODO
* @date 2018/6/8下午11:35
*/
public class HelloImpl implements HelloService {
@Override
public HelloDto getHello(String name) {
return new HelloDto();
}
}  

这两个硬性条件有了,则我们来编写动态代理类了

1. 首先我们先来了解两个API:

  1. public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h):该类用于创建动态代理类的实例,

    1. loader:类的类加载器:一般用户类为AppClassLoader,可通过类名.class.getClassLoader()获得

    2. interfaces:接口数组,前面我们说过,jdk动态代理是基于接口来实现的,所以这个参数就是用来传递接口数组啦

    3. h:用于具体实现Handler,也就是这里执行相关的主要业务逻辑的地方了

  2. InvocationHandler:该接口用于实现动态代理类的相关业务逻辑

    1. 通常需要使用动态代理的话必须实现该接口,并重写其里面的invoke方法。

    2. invoke(Object proxy, Method method, Object[] args)throws Throwable; 

      1. proxy:代理类对象

      2. method:执行的方法

      3. args:相关的参数

编写相关的代理类

package cn.lonecloud.study;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* @author lonecloud
* @version v1.0
* @Package cn.lonecloud.study
* @Description: TODO
* @date 2018/6/8下午11:23
*/
public class ProxyDemo {
//定义实现类对象
Object target;
//构造函数
public ProxyDemo(Object target) {
this.target = target;
}
//获取实现类方法
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> clazz){
//获取代理实例
return(T) Proxy.newProxyInstance(clazz.getClassLoader(),new Class[]{clazz}, (proxy, method, args) -> {
System.out.println(method.getName());
//执行代理对象
return method.invoke(target,args);
});
}
}

  clazz.getClassLoader()获取的是类加载器,第二个参数创建了一个Class[]数组对象,由于传递过来的clazz为接口,所以可以这样写

执行:

        HelloService proxy1 = new ProxyDemo(new HelloImpl()).getProxy(HelloService.class);
HelloDto demo = proxy1.getHello("demo");

  该JDK动态代理的实现基本上就完成了,下一篇文章我们来看一下,jdk动态代理生产的字节码文件究竟是什么个样子

深挖JDK动态代理(二):JDK动态生成后的字节码分析

深挖JDK动态代理(一)的更多相关文章

  1. 深挖JDK动态代理(二):JDK动态生成后的字节码分析

    接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...

  2. JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析

    通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...

  3. JDK动态代理实例

    最近看<深入浅出MyBatis技术原理与实战>这本书时,里面讲到Mapper接口的内部实现是通过JDK动态代理生成实现类,联想到之前看<SPRING技术内幕>这本书里也常常提到 ...

  4. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  5. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  6. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  7. AOP学习心得&jdk动态代理与cglib比较

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  8. JDK动态代理的实现原理

    学习JDK动态代理,从源码层次来理解其实现原理参考:http://blog.csdn.net/jiankunking/article/details/52143504

  9. Java中的JDK动态代理

    所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...

随机推荐

  1. spark、standalone集群 (2)集群zookeeper 热备

     测试 cmd     spark-examples-1.6.0-hadoop2.6.0.jar   spark 2.0以后  就没有这个 jar.需要下载 ./bin/spark-submit -- ...

  2. Html5使用canvas作图

    以下例子是项目中实际用到的.不足之处请大家指正,设计到画线,写文字,填充,文字旋转. <!DOCTYPE html> <html> <head lang="en ...

  3. springIOC源码分析(BeanFactroy)

    启动spring容器加载bean的方式有两种:最基本的容器BeanFactory和高级容器ApplicationContext.这篇文章介绍使用BeanFactory加载bean时的整个过程,当然,A ...

  4. AJAX+springmvc遇到的问题

    当我使用AJAX将表单的值传入处理器中后,经过了一个判断再进行页面跳转时,不能在处理器中使用重定向,它会将重定向的页面内容在AJAX的data中显示出来而不是显示一个页面 所以只能在AJAX 的suc ...

  5. ansible的playbook简单使用

    一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...

  6. shell自定义输入输出 read+echo

    自定义格式输入.输出(244)  输出:echo -e 解释转义字符 -n  回车不换行 \n   新的一行,等同于回车 \t 制表符 \r 回车 \b 回退 baskspace 删除键 演示\n \ ...

  7. log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?> <configuration status="info ...

  8. Delphi之TComponent类

    TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视 ...

  9. Lodop打印控件设置表格次页偏移

    Lodop打印控件有很好的自动分页功能,超文本table表格一页装不下,自动分到第二页,第三页……通常表格之前还会有一些内容,比如标题,制表人名称日期什么的杂七杂八的东西,这种东西会占用一定的空间,这 ...

  10. Jira的搭建

    一.环境准备 jira7.2的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本,如下: java -version 除此之外,我们还需要为jira创建对应的数据库.用户名和密码, ...