java动态代理的2种实现方式
java的动态代理在接java的api上有说明,这里就不写了。我理解的代理:
对特定接口中特定方法的功能进行扩展,这就是代理。代理是通过代理实例关联的调用处理程序对象调用方法。
下面通过一个例子看一下:
接口:
public interface Num {
void show();
int getNum();
int getProduct(int x);
}
实现类:
public class MyNum implements Num {
@Override
public int getNum() {
return 3;
}
@Override
public int getProduct(int x) {
return x;
}
@Override
public void show() {
System.out.println("底层方法打印数字99");
}
}
先看一下Method中的invoke方法在api中是怎么描述的

就是说调用处理程序对接口的实现类对象调用Method对象表示的底层方法。
第一种实现代理的方式:
public class NumProxy {
private Object num;
//通过构造方法构造接口的实现类对象
public NumProxy(Object num) {
this.num = num;
}
public Object getNumByProxy(){
Object numProxy = Proxy.newProxyInstance(num.getClass().getClassLoader(), new Class[]{Num.class}, new InvocationHandler() {
/**
* method: 对应于在代理实例上调用的接口方法的 Method 实例。我理解的就是被代理的真实方法实例
* args: 我理解的是真实方法的参数数组
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
System.out.println("在方法之前开始记录");
String methodName = method.getName();
if("getProduct".equals(methodName)){
obj = method.invoke(num, args);
obj = (Integer) obj * 2;
System.out.println("proxy: getProduct()结束");
}
else if("show".equals(methodName)){
obj = method.invoke(num, args);
System.out.println("proxy: show()结束");
}
return obj;
}
});
return numProxy;
}
}
第二种实现代理的方式:通过实现InvocationHandler接口
public class NumProxyImpl implements InvocationHandler {
//这里我把接口类型具体化了, 没有写成Object
private Num num;
public NumProxyImpl(Num num){
this.num = num;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
String methodName = method.getName();
if("getProduct".equals(methodName)){
System.out.println("proxy: getProduct()开始");
obj = method.invoke(num, args);
obj = (Integer) obj * 2;
System.out.println("proxy: getProduct()结束");
}else if("show".equals(methodName)){
System.out.println("proxy: show()开始");
obj = method.invoke(num, args);
System.out.println("proxy: show()结束");
}
return obj;
}
}
测试代码:
public class TestNum {
public static void main(String[] args) {
//两种方式一起测试
NumProxy np = new NumProxy(new MyNum());
Num numProxy = (Num) np.getNumByProxy();
int x = numProxy.getProduct(2);
System.out.println(x);
numProxy.show();
System.out.println("----------------");
NumProxyImpl npi = new NumProxyImpl(new MyNum());
Num numPro = (Num) Proxy.newProxyInstance(Num.class.getClassLoader(), new Class[]{Num.class}, npi);
int n = numPro.getProduct(3);
System.out.println(n);
numPro.show();
}
}
控制台结果:

第二种方式有点小疑惑,不知道大家有没有,那就是并没有显示的调用NumProxyImpl中的invoke方法,可是却执行了,嗯嗯,这个自己下去看一下啊
不想麻烦的只需要记住就行了。
比如编码的处理就可以用到代理,下次写个例子。
java动态代理的2种实现方式的更多相关文章
- Java动态代理的两种实现方式:
方式一:传统的代理 package cn.hc.domain; import java.lang.reflect.InvocationHandler; import java.lang.reflect ...
- 动态代理的两种实现方式(JDK/Cglib)
=========================================== 原文链接: 动态代理的两种实现方式(JDK/Cglib) 转载请注明出处! ================== ...
- java动态代理的两种方法
动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...
- Java动态代理的两种实现方法
注:文章转载自:https://blog.csdn.net/m0_38039437/article/details/77970633 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术, ...
- Java 动态代理原理图解 (附:2种实现方式详细对比)
动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...
- Java 动态代理
被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...
- 彻底理解JAVA动态代理
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
随机推荐
- 程序猿都没对象,JS竟然有对象?
现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的东西,不论代码封装性,还是小到命名. 好吧, ...
- iOS自定义model排序
在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...
- 敏捷软件开发VS传统软件工程
敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同 ...
- 【一起学OpenFOAM】系列由来
1 为什么要学习OpenFOAM 掐指算起来,接触CFD也差不多有十个年头了,其间一直使用的商用CFD软件,有Fluent.CFX.StarCCM+等,这些商用软件各有其优缺点,都能较好的解决常规的工 ...
- Linux服务器安全配置
众所周知,网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节.Linux被认为是一个比较安全的Internet服务器,作为一种开放源代码操作系统,一旦Linux系统中发现有安全漏洞,Int ...
- 魅力 .NET:从 Mono、.NET Core 说起
前段时间,被问了这样一个问题:.NET 应用程序是怎么运行的? 当时大概愣了好久,好像也没说出个所以然,得到的回复是:这是 .NET 程序员最基本的...呵呵! 微软开源,其实不只是对 .NET 本身 ...
- 【Win10】UAP/UWP/通用 开发之 x:Bind
[Some information relates to pre-released product which may be substantially modified before it's co ...
- 《深入理解Java虚拟机》类文件结构
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...
- 玩转Windows服务系列汇总
玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...
- 如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)
相信很多开发者目前的系统还是Win7或Mac,一般不会为了开发某个程序而重装系统,所以我们就需要用到VMware这类的虚拟机来模拟预期的开发环境.在开始介绍前,给大家说明下我当前的软硬件环境,本文所讲 ...