文档章节

动态代理

凯文加内特
 凯文加内特
发布于 2015/03/04 09:47
字数 514
阅读 27
收藏 0

为什么会有动态代理呢?

在静态代理模式时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;

1.抽象类或者接口

public interface ISubject {
   public void sayHello();
}

2. 真实类(必须实现接口)

public class RealObject implements ISubject {
  public void sayHello() {
  System.out.println("hello glad to see you");
 }
}

3.动态创建代理对象的类(此时不能出现代理对象)

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler{
//拿到对真实对象的引用(因为真实对象可能有很多个,因此我们必须定义成Object类型去任意匹配)
//此时实现的是对任意真实兑现给的引用。此处也是固定的写法
  private Object targetObject = null;
   //方法--> 用来动态的生成代理对象(通过反射在运行期分析类的能力,然后动态生成)
//注意只要是在运行期分析类的能力,都回去涉及到反射方法。
  /***
  * 1, 通过反射进入类的加载器
  * 2,和真实对象实现相同的接口
  * 3,一个对象,这个对象实现了InvocationHandler这个接口的对象的引用
  */
//这个方法也是固定的写法
 public Object createDynamicProxyObjectMethod(Object targetObject){
  this.targetObject = targetObject;//因为是要真实对象的代理,所以这块必须引入真实对象
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), //这个参数是得到类的加载器
           targetObject.getClass().getInterfaces(), 
           this); //此处的this急救等于 new DynaProxyObject()
 }
 
 //被系统自动调用的:只有这个方法时需要自己写的方法
  public Object invoke(Object proxy, Method method, Object[] args)
//注意此处的method不能是数组,若有n多接口或方法时只能是用if去判断及if(method 。equals(""));
//参数args表示方法的参数,参数可以位任意的类型,因此用Object[]去匹配
   throws Throwable {
    Object resultObj = null;
    this.before();
    try {
       resultObj = method.invoke(targetObject, args);
  } catch (Exception e) {
   e.printStackTrace();
  }
    this.after();
    return resultObj;
 }
 public void before(){
  System.out.println("before---------------");
 }
  public void after(){
  System.out.println("after---------------");
 }
 }

 4。客户端测试

public class Client {
  public static void main(String[] args) {
  DynaProxyObject dpo = new DynaProxyObject();
  ISubject isub = (ISubject)dpo.createDynamicProxyObject(new RealObject());
  isub.sayHello();
 }
}

  


本文转载自:http://blog.chinaunix.net/uid-24343152-id-2974824.html

凯文加内特
粉丝 341
博文 701
码字总数 110786
作品 0
青岛
后端工程师
私信 提问
JDK动态代理和CGLiB动态代理

JDK动态代理 JDK动态代理要求类必须实现某一接口,代理类是同一接口的实现类。 JDK动态代理主要涉及两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,可以通过实现该接口定义...

kakayang2011
2016/03/13
130
0
java动态代理

java动态代理用到了java.lang.reflect包的Proxy类和InvocationHandler接口。它们在动态代理中起到的作用如下: Proxy类:提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所...

SeaRise
2017/11/20
0
0
Spring中JDK动态代理和Cglib代理的区别

Spring的AOP基于代理模式,并且它即使用到了JDK动态代理也使用了Cglib代理。 如下代码是springAOP中默认的代理实现类DefaultAopProxyFactory,其中创建代理的方法createAopProxy,在这个方法...

王子城
2018/08/01
1K
0
好程序员Java学习路线之Spring框架之动态代理

好程序员Java学习路线之Spring框架之动态代理,前言:动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解...

好程序员IT
07/18
52
0
静态代理与静态代理

1 代理模式及概念 代理模式是给某个对象提供一个代理对象,并由代理对象控制对原始对象的引用。如下图: 代理类和委托类有共同的父类,这样在任何使用原始对象(委托对象)的地方都可用代理对...

林中漫步
2016/05/15
99
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部