Java 的静态代理和动态代理有哪些差别?
回答·11
最热
最新
- 要了解静态代理和动态代理,先要理解什么是代理。 代理就是一件事情可能特别麻烦,而你又必须要做,这时候就可以引入代理模式,由第三方替你完成上下游的麻烦事情,你只要做自己必须做的部分事情就可以了。这个就是代理的大概概念。 不理解的可以参考买房子。中介协助你完成买房前后的事情,你自己付钱选房就好。 静态代理和动态代理主要就在动和静上。 静态就是不变,也就是一个代理只能对应一类对象,类,接口处理相关的事情。每个类或者接口的每一种代理都要写一个静态代理类。 动态就是变动了,也就是一个代理可以给各种类,接口,对象进行相应的处理,一个动态代理就可以了代理一类事件。
- 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。 动态:在程序运行时运用反射机制动态创建而成。
- JAVA的静态代理与动态代理比较 1.静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。例程1 HelloService.javapackage proxy;import java.util.Date;public interface HelloService{public String echo(String msg);public Date getTime();} 2.动态代理类与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。Proxy类提供了创建动态代理类及其实例的静态方法。 (1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:public static Class getProxyClass(ClassLoader loader, Class[] interfaces) throws IllegalArgumentException参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口。 (2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下: public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler) throwsIllegalArgumentException 参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口,参数handler 指定与动态代理类关联的 InvocationHandler 对象。以下两种方式都创建了实现Foo接口的动态代理类的实例:/**** 方式一 ****///创建InvocationHandler对象InvocationHandler handler = new MyInvocationHandler(...);//创建动态代理类Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });//创建动态代理类的实例Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).newInstance(new Object[] { handler });/**** 方式二 ****///创建InvocationHandler对象InvocationHandler handler = new MyInvocationHandler(...);//直接创建动态代理类的实例Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);由Proxy类的静态方法创建的动态代理类具有以下特点:动态代理类是public、final和非抽象类型的;动态代理类继承了java.lang.reflect.Proxy类;动态代理类的名字以“$Proxy”开头;动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口;
- 代理都是对原有的增强,符合了设计的开闭原则。就是尽量用新增代替修改。 静态代理,适用于简单的操作,但随着业务的需求,破坏开闭原则。 动态代理,扩展性更加良好。 建议看下mybatis的logger模块源码或springaop的实现,更好的理解
- 动态的生成静态代理。
- 我的理解:静态代理的代理类是事先写好的,编译时直接编译了 动态代理是运行后运用反射动态生成代理类
- 静态 相当于接口的活用 动态 反射
- 静态代理的话可以认为是两孔插座,只能插两孔插头,比较死板。动态代理可以认为是三孔插座可以插两头的也可以插三头的,灵活性比较高,可以复用。
- 静态代理运行前能确定类型,一般用工厂方法代理!动态代理运行时才能确定类型,一般用反射
- 静态代理是不可更改的,是一次性的或者是只能服务于同一类事物的,而动态代理是可以进行更改的,是可以再次利用的,也是多元化的…