`
冲杯茶喝
  • 浏览: 30839 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java动态代理源码学习,YY

 
阅读更多

今天看了下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动态代理.rar

    java动态代理项目源代码以及*.class文件反汇编工具,可以下载学习

    Java邮件代理 源码

    在这个"Java邮件代理 源码"中,我们可以深入学习如何在Java环境中构建这样的系统。 邮件代理的核心功能包括: 1. **SMTP(简单邮件传输协议)客户端和服务器**:SMTP是互联网上发送邮件的标准协议。源码可能包含了...

    Java项目开源源码,共111个

    这些源码可以作为学习Java编程的参考资源,也可以作为实际项目开发的基础。 Java项目类型 从源码中可以看到,涵盖了多种Java项目类型,包括: * Web开发项目:使用Java编程语言开发的Web应用程序,例如使用Spring...

    HTTP代理服务器java

    HTTP代理服务器java 简单网站过滤

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...

    Java聚合支付源码

    这套源码对于Java程序员来说,尤其在电商、O2O等领域,是非常有价值的学习和开发资源。 首先,我们要理解什么是聚合支付。聚合支付是指通过一个统一的支付接口,将多种第三方支付方式整合在一起,使得商家只需对接...

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    java小游戏源码集合

    Java小游戏源码集合是一个丰富的资源库,包含了八款经典的Java编程实现的小游戏,这些游戏能够帮助初学者理解和学习Java编程语言以及游戏开发的基本原理。以下是这些游戏的详细讲解: 1. **五子棋**:五子棋是一款...

    Java jdk源码

    学习Java JDK源码能够帮助开发者更好地调试问题,优化代码,并且对软件工程有更深入的理解。 1. **Java类库**:Java JDK源码中的类库提供了大量用于输入/输出、网络通信、集合框架、多线程、异常处理等的基础功能。...

    Java手机游戏源码全集

    Java手机游戏源码全集是一份非常珍贵的学习资源,它涵盖了多种类型的游戏,如玛丽兄弟、大富翁、过山车、斗地主、祖玛、方块、挖金、卡丁车等,这些游戏都是Java语言开发的经典之作。这份源码集对于想要深入学习Java...

    java jdk1.8 源码

    通过对这些源码的学习,开发者可以了解Java如何处理内存管理、多线程、网络通信、异常处理等核心概念,还能深入理解反射、动态代理、并发模型等高级特性。此外,研究源码有助于提升编程技巧,优化代码性能,并能更好...

    动态代理文档和例子源码

    在这个案例中,我们看到一个与"普科国际软件"相关的学习资源,包括一个动态代理的文档和源码例子。 首先,我们要理解动态代理的基本概念。在Java中,有两种实现动态代理的方式:一种是使用Java.lang.reflect.Proxy...

    java物联网平台源码

    物联网平台基于Java8、Spring Boot 2.x、WebFlux、Netty、Vert.x、Reactor等开发,是一个开箱即用,可二次开发的企业级物联网基础平台。平台实现了物联网相关的众多基础功能,能帮助你快速建立物联网相关业务系统。 ...

    Java项目开源源码(电商商城系统)

    Smart Shop商城是基于springcloud的商城系统。百万真实用户沉淀并检验的商城。... B2C商城 小程序商城 H5商城 APP商城 Java商城 积分商城 uniapp商城 商城源码。本商城励志做“Java程序员的首选商城框架!

    java三种方法实现代理模式(源码+jar包)

    本资源提供了三种实现代理模式的方法:静态代理、动态代理以及CGLIB代理,通过源码和jar包的形式供学习者参考。 1. **静态代理** 静态代理是最基础的代理方式,需要手动创建代理类并实现与目标类相同的接口。代理...

    java远程监控源码

    标题“Java远程监控源码”涉及的是Java编程中关于远程监控和控制的实现。这个项目可能包含一个客户端(client)和服务器端(server)的架构,通过Socket通信进行数据交互,利用Java Robot类来捕获屏幕图像,以及...

    YY资源源码_YY签名网站源码

    总的来说,“YY资源源码_YY签名网站源码”是一个涵盖了前端设计、后端开发、用户认证、数据库操作和安全性等多个方面的综合项目,对想要学习或实践网站开发,特别是签名功能实现的开发者来说,是一份宝贵的参考资料...

    20个Java开源项目源码下载

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者青睐。在提供的"20个Java开源项目源码下载"压缩包中,包含了多个知名的...因此,这份源码包是Java开发者学习和成长的宝贵资源。

Global site tag (gtag.js) - Google Analytics