利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现,spring aop就是此原理。

public static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h)throws IllegalArgumentException

newProxyInstance,方法有三个参数:

loader: 用哪个类加载器去加载代理对象

interfaces:动态代理类需要实现的接口

h:动态代理方法在执行时,会调用h里面的invoke方法去执行

定义一个接口:

package com.xhx.java;/*** xuhaixing* 2018/7/30 21:32**/
public interface IVehical {void run();
}

要扩展的类:

package com.xhx.java;/*** xuhaixing* 2018/7/30 21:33**/
public class Car implements IVehical {public void run() {System.out.println("Car会跑");}
}

调用处理类invocationhandler

package com.xhx.java;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** xuhaixing* 2018/7/30 21:38**/
public class VehicalInvacationHandler implements InvocationHandler {private final IVehical vehical;public VehicalInvacationHandler(IVehical vehical){this.vehical = vehical;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("---------before-------");Object invoke = method.invoke(vehical, args);System.out.println("---------after-------");return invoke;}
}

invoke三个参数:

proxy:就是代理对象,newProxyInstance方法的返回对象

method:调用的方法

args: 方法中的参数

package com.xhx.java;import java.lang.reflect.Proxy;/*** xuhaixing* 2018/7/30 21:30**/
public class App {public static void main(String[] args) {IVehical car = new Car();IVehical vehical = (IVehical)Proxy.newProxyInstance(car.getClass().getClassLoader(), Car.class.getInterfaces(), new VehicalInvacationHandler(car));vehical.run();}
}

上面代码中,代理car对象,调用run方法时,自动执行invocationhandler中的invoke方法。

可以打印一下:

 System.out.println(vehical.getClass());

java Proxy.newProxyInstance 动态代理 简介相关推荐

  1. Proxy.newProxyInstance动态代理[z]

    Proxy.newProxyInstance动态代理[z] 博客分类: java 设计模式编程XPJDK.net  From: http://blog.csdn.net/dan_xp/archive/ ...

  2. Java设计模式-----Cglib动态代理(Cglib Proxy)

    接上文:4.2Java设计模式-----JDK动态代理(Dynamic Proxy) Cglib动态代理 百度百科:Cglib是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java ...

  3. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  4. Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...

  5. Java se之动态代理

    转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...

  6. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

  7. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

  8. java | 什么是动态代理?

    java | 什么是动态代理? 代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理,其中 Spring AOP 就是动态代理的典型例子.动态代理又分为接口代理和 cglib (子类代 ...

  9. 码农翻身——Java帝国之动态代理

    已经快三更天了, Java帝国的国王还在看着IO大臣的奏章发呆,他有点想不明白, 帝国已经给臣民了提供了这么多的东西,他们为什么还不满意呢? 集合.IO.反射.网络.线程.泛型.JDBC ...... ...

最新文章

  1. Yii中创建自己的Widget
  2. 探秘Tomcat——一个简易的Servlet容器
  3. 调试中的一些Python错误
  4. 苹果地图副总裁_苹果地图表现糟糕 iOS副总裁福斯特难辞其咎
  5. epson r1900 清零软件_EPSON 1430 R1900 1500 R330 R1800 R2000 R230 打印机清零软件
  6. 开闭原则应用-书店打折Java代码实现
  7. 考研必备数学公式大全(数学二)(线性代数篇)
  8. unity 保存数据到本地的方法
  9. php后缀名的mime类型_PHP实现获取文件mime类型多种方法解析
  10. DAY 3 字符串、列表、字典练习 - 班级按成绩分组小程序快递分拣小程序
  11. 福昕pdf Acrobat DC pdf 右键菜单注册表
  12. 4.3二叉树的非递归中序遍历输出王道数据结构例程实现
  13. 八叉网的神奇明链外链技术
  14. colab使用入门(1)-安装库,保存/加载笔记本
  15. 2018-2019ICPC焦作C题Supreme Command kd-tree
  16. 用Python画动态圣诞树 学会了送给你女朋友呀~
  17. 【AI Studio】飞桨图像分类零基础训练营 - 03 - 卷积神经网络基础
  18. ios 扇形 按钮_iOS 画圆弧或扇形
  19. Java 实现XOR(异或)校验
  20. 金蝶导出明细账到计算机桌面,怎么用金蝶将所有科目的明细账导到一张表格上?...

热门文章

  1. python argsort排序结果_numpy.argsort()可以对元组或列表进行排序
  2. FD.io/VPP — VPP 的实现原理解析
  3. Redis M/S + Keepalived 主从备份高可用
  4. Linux_进程管理计划任务
  5. Altium Designer隐藏或显示元件名字
  6. 甘肃张掖祁连山境内出现雪豹
  7. 关于绑定IP地址与端口号的见解
  8. 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)
  9. 【WPF】对话框/消息弹窗
  10. CentOS7安装iptables防火墙