`
annegu
  • 浏览: 99615 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

静态代理与动态代理

阅读更多
代理的核心任务就是拦截方法的调用,并在需要的时候执行匹配某方法的通知链。
代理分为静态代理和动态代理。

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
分享到:
评论
3 楼 xuehanxin 2011-11-30  
应该多弄几个实现接口的子类才能说明问题
2 楼 nuysoft 2011-11-12  
langyu 写道
不好意思,我怎么看这里的“动态代理”只是代理模式,而不是“动态的”呢?

+1
1 楼 langyu 2009-06-18  
不好意思,我怎么看这里的“动态代理”只是代理模式,而不是“动态的”呢?

相关推荐

    java静态代理与动态代理

    ### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...

    静态代理与动态代理Demo

    代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    Java静态代理和动态代理

    四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    静态代理与动态代理小Demo

    一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进

    JAVA静态代理和动态代理

    静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的同时添加额外的功能。以下是一个简单的静态代理模式示例: 1. 定义接口: ...

    静态代理和动态代理

    根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...

    包含静态代理和动态代理demo代码

    与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...

    Spring的静态代理和动态代理

    本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...

    静态代理和动态代理的讲解和案例,有详细的注释

    总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    静态代理和动态代理的例子

    代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...

    静态代理和动态代理简单实现代码

    静态代理是通过在源代码中创建一个代理类来实现的,这个代理类与真实对象(被代理的对象)有相同的接口。代理类在调用实际对象的方法时,可以添加额外的逻辑。以下是一个简单的静态代理示例: ```java // 接口 ...

Global site tag (gtag.js) - Google Analytics