今天看了下java动态代理的源码,YY下实现,有错请指出
Java动态代理需要实现接口。为什么,Java是这么做的:
Java会根据需要代理类所实现的所有接口,创造一个实现了同样接口的Class对象,并通过类加载器加载。
这个类的构造器需要传入我们实现了InvocationHandler代理类。
当代理类调用接口的方法时,其实是用InvocationHandler.invoke,来实现。
举例:
类A implements B
B有一个方法handleb(String string);
动态代理类C
当B b = C.bind(A)的时候,Proxy会生成一个实现了B的代理类P,并缓存起来。再用P实例化一个B的实例。
P的构造器需要一个C的实例。
P的handleb(String s)方法是这么实现的(YY的)
handleb(String s){
c.invike(c,method,s);
}
c.invike(c,method,s);
c就是P类实例构造时候传入的C实例,也就是我们bind得到的代理类。(验证过)
method是B的handleb方法对应的Method实例。
测试代码:
public interface Sad { void sad(); }
public class SadImpl implements Sad, Inter1 { @Override public void sad() { System.out.println("桑心"); } }
public class DynamicProxy implements InvocationHandler { private Object target; public static Object p; public static Method m; /** * 绑定委托对象并返回一个代理类 * * @param target * @return */ public Object bind(Object target) { this.target = target; // 取得代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); // 要绑定接口(这是一个缺陷,cglib弥补了这一缺陷) } @Override /** * 调用方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("动态代理前"); // 执行方法 p = proxy.getClass(); m = method; result = method.invoke(target, args); System.out.println("动态代理后"); return result; } }
测试类:
@Test public void testDynamicProxy() throws SecurityException, NoSuchMethodException { DynamicProxy proxy = new DynamicProxy(); Sad sad = (Sad) proxy.bind(new SadImpl()); sad.sad(); System.out.println(sad.getClass() == DynamicProxy.p);//true System.out.println(Sad.class.getMethods()[0].equals(DynamicProxy.m));//true System.out.println(Sad.class.getMethods()[0]);//public abstract void cn.teaey.test.proxy.Sad.sad() System.out.println(DynamicProxy.m);//public abstract void cn.teaey.test.proxy.Sad.sad() }
相关推荐
Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...
java动态代理项目源代码以及*.class文件反汇编工具,可以下载学习
java动态代理项目实践优化(3)
在这个"Java邮件代理 源码"中,我们可以深入学习如何在Java环境中构建这样的系统。 邮件代理的核心功能包括: 1. **SMTP(简单邮件传输协议)客户端和服务器**:SMTP是互联网上发送邮件的标准协议。源码可能包含了...
Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 ...
Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、...
Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线任务管理系统源码 Java在线...
Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 ...
几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变...可以学习Java的动态代理模式、学习Java工厂模式以及如何将工厂模式与属性文件相结合。
这套源码对于Java程序员来说,尤其在电商、O2O等领域,是非常有价值的学习和开发资源。 首先,我们要理解什么是聚合支付。聚合支付是指通过一个统一的支付接口,将多种第三方支付方式整合在一起,使得商家只需对接...
该项目是一套基于Spring框架和Quartz调度器的Java动态定时任务解决方案源码,包含24个文件,涵盖12个Java源文件、2个XML配置文件、1个Git忽略文件、1个LICENSE文件、1个Markdown文件、1个SQL文件、1个DDL文件、1个...
JDK动态代理基于Java反射API,可以在运行时动态地生成代理类和实例。它需要目标对象实现至少一个接口,然后通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。...
学习Java JDK源码能够帮助开发者更好地调试问题,优化代码,并且对软件工程有更深入的理解。 1. **Java类库**:Java JDK源码中的类库提供了大量用于输入/输出、网络通信、集合框架、多线程、异常处理等的基础功能。...
Java手机游戏源码全集是一份非常珍贵的学习资源,它涵盖了多种类型的游戏,如玛丽兄弟、大富翁、过山车、斗地主、祖玛、方块、挖金、卡丁车等,这些游戏都是Java语言开发的经典之作。这份源码集对于想要深入学习Java...
在这个案例中,我们看到一个与"普科国际软件"相关的学习资源,包括一个动态代理的文档和源码例子。 首先,我们要理解动态代理的基本概念。在Java中,有两种实现动态代理的方式:一种是使用Java.lang.reflect.Proxy...
Java开发的灵活稳定的企业级ERP系统源码 Java开发的灵活稳定的企业级ERP系统源码 Java开发的灵活稳定的企业级ERP系统源码 Java开发的灵活稳定的企业级ERP系统源码 Java开发的灵活稳定的企业级ERP系统源码 ...
动态代理和RMI(Remote Method Invocation)是Java中两种重要的分布式计算技术,它们在实际的软件开发中扮演着至关重要的角色。本篇将详细介绍这两个概念,以及如何通过源码和PPT来理解它们。 首先,让我们来理解...
Java物联网系统源码 有文档,需要熟悉技术,商业级别,学生勿扰 协议和优势:TCP/IP、HTTP、MQTT? 通讯协议,支持海康摄像头 使用技术:JAVA [ springmvc / spring / mybatis ] 、Mysql 、Html 、Jquery 、css
本资源提供了三种实现代理模式的方法:静态代理、动态代理以及CGLIB代理,通过源码和jar包的形式供学习者参考。 1. **静态代理** 静态代理是最基础的代理方式,需要手动创建代理类并实现与目标类相同的接口。代理...