代理的核心任务就是拦截方法的调用,并在需要的时候执行匹配某方法的通知链。
代理分为静态代理和动态代理。
1、什么叫做静态代理呢,所有的java文件都会被编译成.class文件,.class文件其实就是一组可以被java虚拟机所解释执行的字节码,这些字节码组成了一系列的指令组。
可以在命令行模式下敲入“javap –c TestJob”查看TestJob.class的字节代码。
Javap命令的作用是将一个类和它的方法的一些转储信息输出到标准输出。在你想要查看编译器做了些什么工作的时候,或者想要看一处代码的改动对编译后的类文件有什么影响的时候,javap相当有用。-c选项告诉javap反汇编在类中遇到的字节代码。
public void print();
Code:
0: getstatic #24; //Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: invokevirtual #30; //Method getMessage:()Ljava/lang/String;
7: invokevirtual #32; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: getstatic #24; //Field java/lang/System.out:Ljava/io/PrintStream;
13: ldc #37; //String This is TestJob!
15: invokevirtual #32; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
18: return
}
上面这段就是在TestJob.class中的一部分字节代码,可以看到方法print()是由一系列指令组成的。这段指令在java源文件中仅仅对应如下:
public void print() {
System.out.println(getMessage());
System.out.println("This is TestJob!");
}
静态代理就是在编译完成的.class文件基础上进行修改,直接修改字节码,使它完成代理类的功能。实际上来说,这个新的.class对应的java代码是在源文件的基础上修改而来。因此对开发人员来说,看到的java文件还是原来的目标类,但其实它对应的.class文件已经是修改过后,加入了代理功能的.class了。
AspectJ是静态代理的一个典型的例子。AspectJ只是提供了一种更便捷的工具,使开发人员能够更好的实现静态代理。
2、动态代理类在程序运行时,运用反射机制动态创建而成。
因此,动态代理的性能一般都不如静态代理来得高,但同时它的优点也很明显,开发人员可以随意的修改程序的切片(aspect)却不需要重新编译目标类代码。
Spring的AOP属于动态代理。一般来说,Spring的AOP在实际应用中可以应付大部分的应用,除非性能要求特别高,或者需要用到Spring中没有提供的AOP功能,那么应该使用AspectJ。
Spring中有两种代理:JDK代理与CGLIB代理。
JDK代理只能是基于接口的代理,而CGLIB是可以基于接口或者是类的。
(1) 基于接口的代理实现:
接口类:
package com.anne.test;
public interface TestInterface {
public void print();
}
目标类(具体实现类):
package com.anne.test;
public class TestJob implements TestInterface{
@Override
public void print() {
System.out.println("This is TestJob!");
}
}
基于接口的代理类:
[img]/upload/attachment/112748/2fee1126-8ca9-3810-9e1a-5af6295661b0.bmp" alt="[/img]
package com.anne.test;
public class ProxyTestJob implements TestInterface{
private TestInterface testJob = null;
public ProxyTestJob(TestInterface testJob) {
this.testJob = testJob;
}
@Override
public void print() {
System.out.println("This is ProxyTestJob begin!");
testJob.print();
System.out.println("This is ProxyTestJob end!");
}
}
调用的时候如下:
public static void main(String[] args){
TestInterface test = new ProxyTestJob(new TestJob());
test.print();
}
如上所示代码:代理类与目标类共同实现同一个接口,而在代理类中定义了一个接口类型的变量。
(2) 而对于CBLIB来说,代理类就是目标类的子类:
[img]/upload/attachment/112750/02f2a70c-ec1d-36a1-a51a-21f2a9b5976f.bmp" alt="[/img]
public class ProxyTestJob extends TestJob{
@Override
public void print() {
System.out.println("This is ProxyTestJob begin!");
super.print();
System.out.println("This is ProxyTestJob end!");
}
}
因此在调用的时候只要直接创建代理类即可。
- 大小: 4.3 KB
- 大小: 4.3 KB
分享到:
相关推荐
### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...
静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...
代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...
总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...
一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进
静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的同时添加额外的功能。以下是一个简单的静态代理模式示例: 1. 定义接口: ...
根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...
与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...
本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...
总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
静态代理是通过在源代码中创建一个代理类来实现的,这个代理类与真实对象(被代理的对象)有相同的接口。代理类在调用实际对象的方法时,可以添加额外的逻辑。以下是一个简单的静态代理示例: ```java // 接口 ...