博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态代理
阅读量:5299 次
发布时间:2019-06-14

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

代理,就是须要代理类和被代理类有同样的对外接口或者说成服务。所以代理类一般都必须实现了全部被代理类已实现的接口,由于接口就是制定了一系列对外服务的标准。

 

        正由于动态代理有这样灵活的特性。所以我们在设计动态代理类(DynamicProxy)时不用显式地让它实现与真实主题类(RealSubject)同样的接口(interface),而是把这样的实现推迟到执行时。

        为了能让DynamicProxy类可以在执行时才去实现RealSubject类已实现的一系列接口并执行接口中相关的方法操作。须要让DynamicProxy类实现JDK自带的java.lang.reflect.InvocationHandler接口。该接口中的invoke()方法可以让DynamicProxy实例在执行时调用被代理类的“对外服务”,即调用被代理类须要对外实现的全部接口中的方法,也就是完毕对真实方法的调用,Java帮助文档中称这些真实方法为处理程序。

        我们肯定必须先把被代理类RealSubject已实现的全部interface都载入到JVM中。不然JVM怎么可以找到这些方法呢?明确了这个道理。那么我们就行创建一个被代理类的实例,获得该实例的类载入器ClassLoader。

        所谓的类载入器ClassLoader,就是具有某个类的类定义,即类的内部相关结构(包含继承树、方法区等等)

        动态代理模式能够使得我们在不改变原来已有的代码结构的情况下,对原来的“真实方法”进行扩展、增强其功能,而且能够达到控制被代理对象的行为的目的。

DynamicProxy类必须实现的invoke()方法在调用被代理类的真实方法的前后都可进行一定的特殊操作。这是动态代理最明显的长处

为了解决某些问题,比方,不同意直接訪问某些类;对訪问要做特殊处理等。

或者,要对原方法进行统一的扩展。出现了动态代理需求

类图

JDK动态代理中包括一个类和一个接口: 
InvocationHandler接口: 

public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; }

參数说明: 

Object proxy:指被代理的对象。

 

Method method:要调用的方法 
Object[] args:方法调用时所须要的參数 

能够将InvocationHandler接口的子类想象成一个代理的终于操作类

接口中声明的全部方法都被转移到一个集中的方法中处理(invoke)

动态代理类仅仅能代理接口,代理类都须要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的全部方法时须要调用的,该invoke方法返回的值是被代理接口的一个实现类

主题接口

public interface ISubject {	void doSomething();}
真实对象

public class RealSubject implements ISubject {	@Override	public void doSomething() {		System.out.println("+++RealSubject+++");	}}
handler

public class SubHandler implements InvocationHandler {	private Object obj;// 持有真实对象	public SubHandler(Object obj) {		this.obj = obj;	}	@Override	public Object invoke(Object proxy, Method method, Object[] args)			throws Throwable {		Object result = method.invoke(obj, args);// 真实对象来运行详细的方法		System.out.println("dy proxy ");//增加自己操作		return result;	}}
使用

public class Test {	public static void main(String[] args) {		RealSubject realSubject = new RealSubject();		ISubject sub = (ISubject) Proxy.newProxyInstance(realSubject.getClass()				.getClassLoader(), realSubject.getClass().getInterfaces(),				new SubHandler(realSubject));		sub.doSomething();	}}

//output

+++RealSubject+++

dy proxy

转载于:https://www.cnblogs.com/yangykaifa/p/6892786.html

你可能感兴趣的文章
MVC,MVP 和 MVVM 的图示,区别
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
uva 11468 Substring
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
BootStrap2学习日记2--将固定布局换成响应式布局
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
数据库的高级查询
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>