JavaSE---使用反射生成JDK动态代理
1、概述
1.1 在Java.lang.reflect包下,提供了Proxy类、InvocationHandler接口,使用它们可以生成JDK动态代理类或动态代理对象;
1.2 【Proxy类】
1.1.1 Proxy类是所有动态代理类的父类;
1.1.2 Proxy类提供 用于创建动态代理类、动态代理对象的静态方法;
1.1.3 在程序中,为 一个或多个接口 动态地生成实现类,可以使用Proxy创建动态代理类;
为 一个或多个接口 动态地生成实例,可以使用Proxy创建动态代理对象;
1.1.4 创建动态代理类、动态代理对象的方法
a, public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
创建一个动态代理类 所对应的Class对象,该代理类将实现interfaces所指定的所有接口;
loader:指定生成动态代理类的类加载器;
b, public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
直接创建一个 动态代理对象,该代理对象的实现类 实现了interfaces指定的所有接口;
*****执行代理对象的每个方法时 实际上都是 执行InvocationHandler对象的invoke方法;
2、案例
package com.exiuge.mytest.dongtaidaili; public interface Person { void say(String s); void walk(); }
package com.exiuge.mytest.dongtaidaili; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvokationHandler implements InvocationHandler { /** * 执行代理对象的方法时,都会被替换成执行下面的invoke方法 * @param proxy 动态代理对象 * @param method 正在执行的方法 * @param args 执行代理对象的方法的传入参数 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("正在执行的代理对象的方法:"+method); if (args!=null){ System.out.println("正在执行的代理对象的方法的传入参数"); for (Object o:args) { System.out.println(o); } }else { System.out.println("正在执行的代理对象的方法没有传入参数"); } return null; } }
package com.exiuge.mytest.dongtaidaili; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args){ //创建自定义的InvocationHandler InvocationHandler invocationHandler=new MyInvokationHandler(); //生成指定接口的动态代理对象 Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader(),new Class[]{Person.class},invocationHandler); person.say("hello"); person.walk(); } }
执行结果:
JavaSE---使用反射生成JDK动态代理的更多相关文章
- 利用反射生成JDK动态代理
利用反射生成JDK动态代理 在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类和动态代理 ...
- Java基础之反射生成JDK动态代理
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口.通过这个类和接口可以生成JDK动态代理类或动态代理对象. JDK动态代理例子: / ...
- MyBatis之反射技术+JDK动态代理+cglib代理
一.反射 引用百度百科说明: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...
- Java 反射之JDK动态代理
Proxy提供用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类.如果我们在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类:如果需要为一个或多个接口动态的 ...
- MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)
在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析
通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...
- 深挖JDK动态代理(二):JDK动态生成后的字节码分析
接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...
- JAVA-获取 JDK 动态代理生成的 Class 文件
可指定路径 import sun.misc.ProxyGenerator; import java.io.FileOutputStream; import java.io.IOException; i ...
随机推荐
- tarjan进阶
一.边双连通分量 定义 若一个无向图中的去掉任意一条边都不会改变此图的连通性,即不存在桥,则称作边双连通图.一个无向图中的每一个极大边双连通子图称作此无向图的边双连通分量. 实际求法和强连通分量差不多 ...
- Mat的迭代器使用
如果你熟悉 C++的 STL 库,那一定了解迭代器(iterator)的使用.迭代器可以方便地遍历所有元素.Mat 也增加了迭代器的支持,以便于矩阵元素的遍历.下面的例程功能跟上一节的例程类似,但是由 ...
- WordCount编码与测试
1. github项目地址:https://github.com/wwwwu/WordCount 2.PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning ...
- U盘刻录14.10镜像出问题的解决方法
从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:https://bugs.launchpad.net/ubunt ... reator/+bug/1325801 ...
- Git知识点汇总
设置全局用户名 git config --global user.name "yourname" 设置全局邮箱 git config --global user.email &qu ...
- 《Linux内核设计与实现》读书笔记(四)- 进程的调度
主要内容: 什么是调度 调度实现原理 Linux上调度实现的方法 调度相关的系统调用 1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计 ...
- Docker基本使用(二) Hello World
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob:~$ docker run ubunt ...
- Glib之主事件循环
介绍 GLib和GTK+应用的主事件循环管理着所有事件源.这些事件的来源有很多种比如文件描述符(文件.管道或套接字)或超时.新类型的事件源可以通过g_source_attach()函数添加. 为了让多 ...
- java8 获取某天最大(23:59:59)和最小时间(00:00:00)
public class DateUtil { // 获得某天最大时间 2018-03-20 23:59:59 public static Date getEndOfDay(Date date) { ...
- luogu2723 丑数
提供一种单调队列做法(非正解) 显然每一个丑数能够由一个质数乘以另一个丑数得到 所以我们开k个单调递增队列,每次从这些队列顶部找到一个最小的元素把他捞出来,然后枚举所有质数,用这个元素乘以质数,放入相 ...