`
gaojingsong
  • 浏览: 1201371 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【JAVA 之动态代理(一)】

阅读更多

永久链接: http://gaojingsong.iteye.com/blog/2285271

 

预览文章: 设计模式之代理模式

 

静态代理类优缺点

优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 

缺点: 

1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。 

2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。 

另外,如果要按照上述的方法使用代理模式,那么真实角色(委托类)必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色(委托类),该如何使用代理呢这个问题可以通过Java的动态代理类来解决。

 

动态代理分为两种:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。其中JDK提供的动态代理必须提供接口,而cglib则不需要提供接口。java的JDK动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。

 

JDK代理的实现步骤是:

1)提供接口

2)提供接口的实现类

3)编写代理类,实现InvoCationHandler接口

 

 

源码案例:

1)定义接口

package demo;

public interface KindWomen {

    // 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人

    public void makeEyesWithMan();// 抛媚眼

}

2)实现接口

package demo;

//潘金莲是什么样的人

public class PanJinLian implements KindWomen {

    public void makeEyesWithMan() {

        System.out.println("潘金莲抛媚眼...");

    }

}

3)编写代理类

package demo;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

public class ProxyWomen implements InvocationHandler {

 

private Object target;

 

public Object bind(Object target){

this.target = target;

return Proxy.newProxyInstance(target.getClass().getClassLoader(),

target.getClass().getInterfaces(), this);

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result = method.invoke(target, args);  

        return result;  

}

 

}

 

4) 测试

package demo;

 

public class DemoMain {

/**

* @param args

*/

public static void main(String[] args) {

ProxyWomen proxyWomen = new ProxyWomen();

KindWomen kindWomen = (KindWomen) proxyWomen.bind(new PanJinLian());

kindWomen.makeEyesWithMan();

}

 

}

 

 



 动态代理类优缺点

优点 

1.动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。 

2.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。

 

缺点 

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

 

 

一个典型的动态代理创建对象过程可分为以下四个步骤:
1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))

  • 大小: 91.1 KB
0
0
分享到:
评论

相关推荐

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

    java动态代理demo

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...

    java动态代理实例

    Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用真实目标对象的方法时添加额外的功能或行为。在这个实例中,我们将深入探讨Java动态代理的核心概念,...

    java Proxy 动态代理

    Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...

    Java代理模式Java动态代理

    Java动态代理是基于Java反射机制的一种实现方式,它允许我们在运行时动态地创建一个实现了某些接口的新类。Java动态代理主要用于创建代理对象,这些代理对象可以实现在特定时刻的行为增强。 **1. Java动态代理类的...

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    JAVA实现动态代理的简单流程

    这是因为Java动态代理的核心在于生成一个实现了特定接口的代理对象,因此必须先有接口作为代理的基础。 ```java interface AA { void method(); } class Ab implements AA { @Override public void method() { ...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

    java动态代理实现详解

    总的来说,Java动态代理是Java平台中一个强大而灵活的工具,它能够帮助开发者在运行时构建具有额外功能的对象,同时保持代码的简洁性和可维护性。通过理解其工作原理和使用方式,我们可以更好地利用它来解决实际问题...

    java动态代理 经典文章(word 2007格式的)

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理主要应用于面向切面编程(AOP)和事件监听等场景,使得代码更加模块化,易于维护。以下是...

    Java动态代理helloworld

    本篇文章将深入探讨Java动态代理的概念、原理以及如何通过一个简单的"Hello, World!"示例来理解它。 动态代理,顾名思义,是在程序运行时动态地生成代理对象。与静态代理(编译时已知)相比,动态代理更加灵活,...

    一个简单的java动态代理的实例

    Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...

    java 动态代理 简单实例

    Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...

    Java中的动态代理

    下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl implements HelloWorld { ...

Global site tag (gtag.js) - Google Analytics