`
dingchd
  • 浏览: 15671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java动态代理原理简单描述

    博客分类:
  • java
 
阅读更多
java的动态代理使用Proxy.newInstance(classloader,interfaces,invocationHandler)方法

该方法进行以下操作:
用classloader作为Proxy0的定义类加载器在内存中加载一个Proxy0类,并实现interfaces的所有接口,同时将invocationHandler传进去Proxy中
interface Bussiness {
	public void doBussiness();
}


public class BussinessImpl implements Bussiness {
	@Override
	public void doBussiness() {
		System.out.println("i do bussiness");
	}
}


public class BussinessInf implements InvocationHandler {
	private Object obj;

	public BussinessInf(Object obj) {
		this.obj = obj;
	}

	@Override
	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {
		System.out.println(proxy.getClass().getName());
		System.out.println("do something before bussiness");

		return m.invoke(obj, args);
	}
}


public class TestMain {
	public static void main(String[] args) {
		Bussiness b = new BussinessImpl();
		BussinessInf proxy = new BussinessInf(b);
		
		Bussiness b1 = (Bussiness) 

Proxy.newProxyInstance(b.getClass().getClassLoader()	, b.getClass().getInterfaces(),proxy);
		System.out.println(b1.getClass().getName());
// proxytest.$Proxy0
		b1.doBussiness();
	}
}


也就是说,将接口定义的方法委托给Proxy,Proxy实现了接口所有的方法;
Proxy内部使用InvocationHandler调用所有接口的方法,而该handler就是我们编写的代理实现逻辑

ps:Proxy0类字节码的获取可以修改jdk的classloader的defineclass方法,在加载字节码时临时将byte数组保存到文件中。或者自己实现一个classloader传入Proxy.newInstance方法

另外。springaop中有还有一个实现的方式叫cglib
cglib是通过继承类的形式,动态生成一个子类。

但是继承类的方式不能aop拦截父类中final方法

如果想aop拦截父类的final方法,只能使用类似asm字节码的暴力手段了。
分享到:
评论

相关推荐

    Java动态代理实现数据源连接池

    Java动态代理是Java语言提供的一种机制,它允许在运行时创建一个对象的代理,这个代理对象可以在调用实际方法之前和之后添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    java动态代理

    虽然在本描述中没有提供具体的源码,但通常对`Proxy`类和`InvocationHandler`接口的深入研究可以帮助我们理解其内部工作原理,例如方法调用如何被转发,以及如何自定义代理行为。 总的来说,Java动态代理是Java...

    java反射机制与动态代理

    ##### 3.1 动态代理原理 - **接口**:目标对象必须实现接口,因为Java动态代理是基于接口的。 - **代理类**:由JVM在运行时自动生成。 - **InvocationHandler**:实现了`InvocationHandler`接口的类,负责处理代理...

    java代理源码

    Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...

    JDK动态代理源码

    3. **不同类,不同方法的代理**:在描述中提到的“不同类,不同方法的代理”意味着JDK动态代理可以为任何实现了相同接口的类创建代理,而不仅仅是单一类。这得益于`InvocationHandler`的灵活性,它可以处理任何接口...

    Java 设计模式与原理

    ### Java设计模式与原理 #### 一、概述 在软件工程领域,设计模式是指在特定情境下解决软件设计问题的最佳实践。《Java 设计模式与原理》这本书被誉为Java程序员的必备指南之一,它深入浅出地讲解了23种经典的设计...

    简谈jdk动态代理

    本文将基于提供的描述和部分代码,详细介绍JDK动态代理的工作原理、核心组件以及如何实际应用。 #### 二、JDK动态代理的核心概念 JDK动态代理主要依赖于两个核心组件:`InvocationHandler`接口和`Proxy`类。 #####...

    java知识点汇总

    和【描述】:“内容较杂,有java初中高级知识点,也有Java web架构及原理”来看,涉及的内容包括了Java的序列化与反序列化、IO流的基础知识、多态的概念、泛型的应用、反射机制,以及Java EE中的设计模式,包括代理...

    java Webservice 简单实例

    本教程将通过一个简单的Java WebService实例,帮助你理解其工作原理和实现过程。 1. **了解WebService** WebService是一种通过网络进行通信的软件系统,使用SOAP(简单对象访问协议)进行消息传输,WSDL描述了服务...

    代理商管理系统(javaweb)

    虽然描述中只提供了数据库联系人的QQ号,但可以推测,一个完整的代理商管理系统必然包含对代理商信息、订单、库存等数据的管理。数据库设计应遵循关系数据库原理,可能包括代理商表(Agent)、订单表(Order)、商品...

    爬虫 算法 Java描述

    比如,HttpURLConnection是Java内置的API,简单易用;而HttpClient则提供了更高级的功能,如设置代理、处理cookies等。 接着,解析网页内容是爬虫的重要环节。Java中常用的HTML解析库有Jsoup,它提供了简洁的API,...

    java简历模板(技能描述+项目经验+面试总结)

    还要提及对SpringBoot、SpringCloud微服务架构的理解和实践经验,以及Linux操作、JVM调优、Tomcat并发调优、Nginx反向代理等技能。 项目经验是简历中的亮点,你可以用你最熟练的项目进行包装,即使只是一个简单的...

    java字节码例子 可以动态修改类 bcel

    Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够...同时,这也是一种深入理解JVM工作原理的方式,有助于提升Java编程的技能和对底层机制的理解。

    java_CORBA.rar_CORBA java_Java CORBA_corba

    描述中的"远程方法调用实现的小程序",意味着这个压缩包可能包含了一个简单的Java应用,该应用演示了如何使用CORBA进行远程方法调用(Remote Method Invocation, RMI)。RMI是Java语言的一个特性,用于实现Java对象...

    java源码:Java的HTTP代理服务器 Smart Cache.zip

    开发者可以通过阅读和分析源码,深入理解Java中的HTTP通信、代理服务器工作原理以及高效的缓存策略。 【标签】: 1. **Java**:表明该项目是用Java语言编写的,Java是一种广泛应用的面向对象的编程语言,具有跨平台...

    spring特点和原理.学习笔记

    3. **配置元数据**:Spring通过XML、Java注解或基于Java的配置来定义bean的元数据,这些元数据描述了bean的属性、依赖关系以及初始化方法等信息。 4. **自动装配**:Spring允许通过@Autowired注解自动匹配和注入...

    spring-aop。以及把代理类 文件输出

    在本项目中,可能使用了JDK动态代理,因为描述中提到了"需要导入jre下面的rt.jar包",这是JDK的基础库,包含了动态代理的相关类。 要使用Spring AOP,首先需要在项目的配置文件(如applicationContext.xml)中启用...

    java调用snmp协议

    **标题解析:** "java调用snmp协议" 指的是使用Java编程语言来实现对SNMP(简单网络管理协议)的调用。SNMP主要用于监控和管理网络设备,如路由器、交换机等,而Java作为一种跨平台的编程语言,能够方便地实现这种...

    java性能调优及原理介绍.rar

    3. 避免过度使用反射和动态代理:它们会带来额外的性能开销。 4. 利用Java 8的Stream API进行集合操作优化。 六、数据库优化 1. SQL查询优化:减少JOIN操作,合理设计索引,避免全表扫描。 2. 连接池配置:如C3P0、...

Global site tag (gtag.js) - Google Analytics