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 ...
随机推荐
- ZROI2018提高day4t2
传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...
- 1027C Minimum Value Rectangle
传送门 题目大意 有n个木棍,让你选4根使得组成的矩形的周长的平方除以面积最小. 分析 这个题看起来就是一个需要证明的贪心,下面我们来证明一下: 所以我们只需要枚举一边所有的a的可能值,然后b就是比a ...
- Jsp入门第二天
1. JSP 指令: JSP指令(directive)是为JSP引擎而设计的. 它们并不直接产生任何可见输出, 而只是告诉引擎如何处理JSP页面中的其余部分. 2. 在目前的JSP 2.0中,定义了p ...
- Linux下遇到的操作 (持续更新……)
1.作业让写一个输入输出重定向,管道联接.这里要讲的不是这个而是 我当时想写个程序来演示这些功能:但我发现我的虚拟机中没有装GNU不能用g++命令,然后就惊奇的发现Linux命令行可以直接联网下载安装 ...
- 处理器(也就是执行流程图上面的controller)执行逻辑(十)
处理器继承自:AbstractController,MultiActionController 一.AbstractController 如上图,可以分析出AbstractController用的 ...
- android报错:org.ksoap2.SoapFault cannot be cast to org.ksoap2.serialization.SoapObject
今天在写一个webservice时一直报错,报Caused by: java.lang.ClassCastException: org.ksoap2.SoapFault cannot be cast ...
- Metasploit 读书笔记-持久控制
Meterpreter的persisitence脚本允许主任meterpreter代理,以确保系统重启之后Meterpreter还能运行。如果是反弹连接方式,可以设置连接攻击机的时间间隔。如果是绑定方 ...
- Python中__call__的用法
概念: Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的.换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符. 示例: 所 ...
- AngularJS(四)——ng-controller(控制器)
前言 上篇大概说了一下指令的应用格式以及创建自定义指令方法,本篇重点介绍一些ng-controller都有哪些小作用. 内容 通过修改控制器部分,修改显示界面. Demo <div ng-app ...
- Jmeter处理cookie
修改bin/jmeter.properties中的 保存后重启jmeter 在测试计划中添加HTTP Cookie 管理器