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 ...
随机推荐
- vmtools!HashTable_GetNumElements+0x5c17
vmtools!HashTable_GetNumElements+0x5c17 vmtools 应该就是虚拟机和主机通信的问题. HashTable_GetNumElements好想也出错了.
- 安装Fastqc软件遇到的坑
由于之前的HPC太难用了,所以决定搬家到十楼的工作站,于是就免不了配置必要的工作环境,其中一个少不了要安装的软件是就是fastqc,因为它太常用了. 我先是用conda安装,因为conda实在是太方便 ...
- CLRMonitor - 跟踪CLR内部执行过程工具
CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...
- netty中的PlatformDependent
通过类名就知道这是一个平台有关的类,通过对该类的学习可以帮助我们实现一个跨平台的应用.但是有些方法放的实现不是很好,比如:isWindows0.通过File的separator就可以判断出来.没必要那 ...
- Android中常见的内存泄漏
为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...
- JDBC 配置环境
一.配置JDBC环境:先下载驱动jar包 1.配置classpath环境变量 如(E:\jdbc\mysql-connector-java-5.1.7-bin.jar) 2.数据库URL: 2.1 ...
- 关于文本PDG的字体
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03 有不少人在问为什么有些文本PDG在SSREADER里看到的是宋体,在Acobat里看到的是黑体,其实原因 ...
- Django之博客系统:自定义模板标签
Django提供了很多内置的模板标签比如{% if %}或者{% block %}Django也允许你创建自己的模板标签(template tags)来执行自定义的动作.当你需要在你的模板中添加功能而 ...
- 3分钟实现iOS语言本地化/国际化(图文详解)
前言 语言本地化,又叫做语言国际化. 是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言. 往往一些应用程序需要提供给多个国家的人群使用,或者一个国家有多种语言,这 ...
- ASP前端控件设置只读不要用enabled
会导致后台取不到这个控件的值,应该用readonly