博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习-动态代理-1-方法newProxyInstance介绍
阅读量:4301 次
发布时间:2019-05-27

本文共 1830 字,大约阅读时间需要 6 分钟。

这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理。我们学习动态代理直接从学习一个方法开始,这个方法叫newProxyInstance, 方法有三个参数。

 

方法newProxyInstance

这个方法的作用是:在运行时,动态创建一组指定的接口的实现类对象。动态代理的作用是最终学习AOP, 也就是面向切面编程。面向切面编程和装饰器有点相似,但比装饰器更加灵活。

 

JAVA SE JDK API文档打开,搜索Proxy这个类,这个类在java.lang.reflect包下,在反射包下。文档好多描述,概念一开始肯定看不懂,干脆不看好了,直接来看这个动态代理类的方法。

红圈这个方法就是重点,学习动态代理就只学习这个方法就可以。这个方法的作用就是:在运行时,创建实现了指定一组接口的对象。这个方法有三个参数,指定的而一组接口就是第二个参数,是一个Class数组,接下来具体看看三个参数。

 

 

方法的三个参数

三个参数,按照顺序分别是 ClassLoader (类加载器),interfaces(一组接口,接口数组),InvocationHandler(调用处理器)。

ClassLoader (类加载器)

我们在计算机硬盘写了代码,编译之后,产生字节码文件,例如A.class,这个字节码文件先要加载到JVM内存中才可以跑起来。从硬盘把字节码加载到JVM内存中,需要一个对象去完成这个操作,这个对象就叫ClassLoader (类加载器)。关于类加载,学习完动态代理,我们再来详细学习一下这个知识点。

 

接口数组:

这个参数是一个接口数组,假如我们有接口A和接口B,那么这个参数传进去的写法就是这样 Class[]{A.class, B.class},这个好理解。通过这个方法,得到的代理对象,同时创建了接口A和接口B的具体实现类对象。

 

调用处理器:

调用处理器是一个接口。它的作用是:代理对象的几乎所有方法都会调用InvocationHandler的invoke()方法,其中getClass()方法不执行。

 

代码演示

下面这段代码演示了三个参数如何使用,以及验证了获取这个代理对象转换成指定接口实现类对象,还有证明:代理对象的几乎所有方法都会调用InvocationHandler的invoke()方法。

package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import org.junit.Test;public class Demo1 {	@Test	public void fun1() {		// 1.获取ClassLoader		ClassLoader loader = this.getClass().getClassLoader();		// 2.调用处理器		InvocationHandler handler = new InvocationHandler() {			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {				System.out.println("你好,动态代理");				return null;			}		};				// 3.得到代理对象		Object o = Proxy.newProxyInstance(loader, new Class[] {A.class, B.class}, handler);				// 强制转换成A 或者B 类型		A a = (A) o;		B b = (B) o;		// 以下代码证明:代理对象的几乎所有方法都会调用InvocationHandler的invoke()方法		a.a();		a.aa();		b.b();		b.bb();		System.out.println(a.getClass());	}}interface A {	public void a();	public void aa();}interface B {	public void b();	public void bb();}

 

转载地址:http://wqxws.baihongyu.com/

你可能感兴趣的文章
TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
查看>>
c++中默认32位int类型转换截取高位部分
查看>>
labview中的移位寄存器、循环隧道,自动索引隧道的区别
查看>>
labview中的移位寄存器、循环隧道,自动索引隧道的区别
查看>>
C# SerialPort 读写三菱FX系列PLC
查看>>
指针的好处
查看>>
c++中用new和不用new创建对象的本质区别
查看>>
浅谈跳槽
查看>>
c#如何跨线程调用窗体控件
查看>>
Action<T> 无参数委托详解
查看>>
WPF的binding
查看>>
c++的构造函数初始化列表
查看>>
在C++里,有两种方法创建对象:
查看>>
浅谈C/C++中的指针和数组(一)
查看>>
C++中引用(&)的用法和应用实例
查看>>
C++中重载与重写函数区别及虚函数(转载)
查看>>
指针作为函数形参
查看>>
c#中的静态构造函数
查看>>
用c#绘制曲线图
查看>>
C++中重写与覆写(虚函数virtual)的区别
查看>>