`
冲杯茶喝
  • 浏览: 31288 次
  • 性别: 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动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    java动态代理.rar

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

    Java邮件代理 源码

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

    Java项目开源源码,共111个

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

    Java文件管理系统源码.zip

    Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 Java文件管理系统源码 ...

    HTTP代理服务器java

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

    基于java的开发源码-HTTP代理服务器 Smart Cache.zip

    基于java的开发源码-HTTP代理服务器 Smart Cache.zip 基于java的开发源码-HTTP代理服务器 Smart Cache.zip 基于java的开发源码-HTTP代理服务器 Smart Cache.zip 基于java的开发源码-HTTP代理服务器 Smart Cache.zip ...

    java 制作的企业网站源码

    java源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码源码...

    java SSM 框架源码 企业

    java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业java SSM 框架源码 企业...

    Java宿舍管理系统源码.zip

    Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 Java宿舍管理系统源码 ...

    Java聚合支付源码

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

    Java反射和动态代理实例

    几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变...可以学习Java的动态代理模式、学习Java工厂模式以及如何将工厂模式与属性文件相结合。

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

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

    Canvas绘图程序Java源码分享源码学习a

    Canvas绘图程序Java源码分享源码学习a

    proxy.rar java三种代理模式源码

    总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...

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

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

    Java jdk源码

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

    java物联网平台源码

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

    基于Netty框架的Java内网穿透与反向代理工具设计源码

    该项目是一款基于Netty框架开发的Java内网穿透与反向代理工具设计源码,总计包含117个文件,涵盖70个Java源文件、9个PNG图片文件、8个XML配置文件、4个Markdown文件、4个CRT证书文件、3个HTML文件以及少量其他类型...

Global site tag (gtag.js) - Google Analytics