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.lang.reflect.Proxy`类和`java.lang....
虽然在本描述中没有提供具体的源码,但通常对`Proxy`类和`InvocationHandler`接口的深入研究可以帮助我们理解其内部工作原理,例如方法调用如何被转发,以及如何自定义代理行为。 总的来说,Java动态代理是Java...
##### 3.1 动态代理原理 - **接口**:目标对象必须实现接口,因为Java动态代理是基于接口的。 - **代理类**:由JVM在运行时自动生成。 - **InvocationHandler**:实现了`InvocationHandler`接口的类,负责处理代理...
Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...
3. **不同类,不同方法的代理**:在描述中提到的“不同类,不同方法的代理”意味着JDK动态代理可以为任何实现了相同接口的类创建代理,而不仅仅是单一类。这得益于`InvocationHandler`的灵活性,它可以处理任何接口...
### Java设计模式与原理 #### 一、概述 在软件工程领域,设计模式是指在特定情境下解决软件设计问题的最佳实践。《Java 设计模式与原理》这本书被誉为Java程序员的必备指南之一,它深入浅出地讲解了23种经典的设计...
本文将基于提供的描述和部分代码,详细介绍JDK动态代理的工作原理、核心组件以及如何实际应用。 #### 二、JDK动态代理的核心概念 JDK动态代理主要依赖于两个核心组件:`InvocationHandler`接口和`Proxy`类。 #####...
和【描述】:“内容较杂,有java初中高级知识点,也有Java web架构及原理”来看,涉及的内容包括了Java的序列化与反序列化、IO流的基础知识、多态的概念、泛型的应用、反射机制,以及Java EE中的设计模式,包括代理...
本教程将通过一个简单的Java WebService实例,帮助你理解其工作原理和实现过程。 1. **了解WebService** WebService是一种通过网络进行通信的软件系统,使用SOAP(简单对象访问协议)进行消息传输,WSDL描述了服务...
虽然描述中只提供了数据库联系人的QQ号,但可以推测,一个完整的代理商管理系统必然包含对代理商信息、订单、库存等数据的管理。数据库设计应遵循关系数据库原理,可能包括代理商表(Agent)、订单表(Order)、商品...
比如,HttpURLConnection是Java内置的API,简单易用;而HttpClient则提供了更高级的功能,如设置代理、处理cookies等。 接着,解析网页内容是爬虫的重要环节。Java中常用的HTML解析库有Jsoup,它提供了简洁的API,...
还要提及对SpringBoot、SpringCloud微服务架构的理解和实践经验,以及Linux操作、JVM调优、Tomcat并发调优、Nginx反向代理等技能。 项目经验是简历中的亮点,你可以用你最熟练的项目进行包装,即使只是一个简单的...
Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够...同时,这也是一种深入理解JVM工作原理的方式,有助于提升Java编程的技能和对底层机制的理解。
描述中的"远程方法调用实现的小程序",意味着这个压缩包可能包含了一个简单的Java应用,该应用演示了如何使用CORBA进行远程方法调用(Remote Method Invocation, RMI)。RMI是Java语言的一个特性,用于实现Java对象...
开发者可以通过阅读和分析源码,深入理解Java中的HTTP通信、代理服务器工作原理以及高效的缓存策略。 【标签】: 1. **Java**:表明该项目是用Java语言编写的,Java是一种广泛应用的面向对象的编程语言,具有跨平台...
3. **配置元数据**:Spring通过XML、Java注解或基于Java的配置来定义bean的元数据,这些元数据描述了bean的属性、依赖关系以及初始化方法等信息。 4. **自动装配**:Spring允许通过@Autowired注解自动匹配和注入...
在本项目中,可能使用了JDK动态代理,因为描述中提到了"需要导入jre下面的rt.jar包",这是JDK的基础库,包含了动态代理的相关类。 要使用Spring AOP,首先需要在项目的配置文件(如applicationContext.xml)中启用...
**标题解析:** "java调用snmp协议" 指的是使用Java编程语言来实现对SNMP(简单网络管理协议)的调用。SNMP主要用于监控和管理网络设备,如路由器、交换机等,而Java作为一种跨平台的编程语言,能够方便地实现这种...
3. 避免过度使用反射和动态代理:它们会带来额外的性能开销。 4. 利用Java 8的Stream API进行集合操作优化。 六、数据库优化 1. SQL查询优化:减少JOIN操作,合理设计索引,避免全表扫描。 2. 连接池配置:如C3P0、...