`

java 代理(二)

    博客分类:
  • java
 
阅读更多

上一编bolg我们已经了解了jdk实现的动态代理,接下来我们再来了解一下cglib的动态代理。

首先我们先看一下cglib动态代理怎么写。

目标类:BookService

package com.cglib.proxy;

public class BookService {

	public void add(){
		System.out.println("添加图书....");
	}
}

 Cglib代理实现类:BookCglibProxy

package com.cglib.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


public class BookCglibProxy implements MethodInterceptor {
	/** 被代理对象 */
	private Object target;
	
	public Object getInstance(Object target) {
		this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());//目标类作为父类
        // 回调方法  
        enhancer.setCallback(this);  
        // 创建代理对象  
        return enhancer.create();  
	}
	
    /**
     * 回调方法
     */
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("事务开始....");  
        Object result = proxy.invokeSuper(obj, args);  
        System.out.println("事务结束....");  
        return result;  
	}

}

 Cglib测试类:TestCglibProxy

package com.cglib.proxy;

public class TestCglibProxy {

	public  static void main(String[] args) {
		BookService target = new BookService();
		BookCglibProxy bookCglib = new BookCglibProxy();
		BookService proxy = (BookService) bookCglib.getInstance(target);
		proxy.add();
	}
}

 测试结果

事务开始....
添加图书....
事务结束....

 接下来首先我们了解一下cglib实现动态代理的原理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

跟着我们简单了解一下CGLIB

 一、什么是CGLIB

CGLIB是一个强大的高性能的代码生成包。

      1>它广泛的被许多AOP的框架使用,例如:Spring AOP和dynaop,为他们提供方法的interception(拦截);

       2>hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的);

       3>EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包。

     它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。

二、底层

CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类。除了CGLIB包,脚本语言例如 Groovy和BeanShell,也是使用ASM来生成java的字节码。当不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。所以cglib包要依赖于asm包,需要一起导入。下图为cglib与一些框架和语言的关系(CGLIB Library and ASM Bytecode Framework)

 

总结

典型的JDK动态代理创建过程可分为以下四个步骤:
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))

 

典型的CGLIB动态代理创建过程可分为以下两个步骤:

1、通过实现MethodInterceptor接口自定义方法创建代理对象;

     (1).方法内首先利用Enhancer对象设置需要代理的类;

     (2).然后设置回调方法enchancer.setCallback(this);

     (3).最后通过字节码技术动态创建代理对象enhancer.create()。

2、实现public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)回调方法拦截所有目标类方法的调用。

     (1).目标方法调用前的动态增强处理;

     (2).通过proxy代理实例调用proxy.invokeSuper(obj, args)调用父类方法执行目标方法;

     (3).目标方法调用后的动态增强处理。

 

 

  • 大小: 14 KB
分享到:
评论

相关推荐

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    java代理机制 JDK动态代理和cglib代理 详解

    Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    java代理模式

    Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...

    JAVA设计模式(代理模式)

    二是JDK的动态代理API,如java.lang.reflect.Proxy类。动态代理更加灵活,不需要为每个目标类单独编写代理类。 3. **远程代理:**远程代理是代理模式的一个特殊应用,它使得客户端可以像操作本地对象一样操作远程...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...

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

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    Java静态代理和动态代理

    二、静态代理 静态代理是在编译时就确定的,代理类的代码是显式编写的。在给定的例子中,`HelloServiceProxy` 是一个静态代理类,它持有一个 `HelloService` 的引用,即 `HelloServiceImpl` 对象。当客户端调用 `...

    Java中的动态代理

    #### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`...

    java动态代理和反射

    java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...

    java代理实例可供参考

    Java代理在编程中是一种强大的设计模式,它允许我们在不修改原始类代码的情况下,为对象提供额外的功能或控制。在这个“java代理实例”中,我们将会深入探讨Java动态代理(Dynamic Proxy)以及静态代理(Static ...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    二、 静态代理 静态代理是代理模式的一种实现方式,即通过手动编写代理类来实现对目标对象的代理。例如,以下代码展示了如何使用静态代理对 UserServiceImpl 进行功能增强: ```java public class UserServiceProxy...

    java代理模式和动态代理

    ### Java代理模式和动态代理详解 #### 一、概述 在软件工程中,代理模式是一种常用的软件设计模式,主要用于在不直接暴露目标对象的情况下提供一个替代接口。这种模式可以简化客户端与目标对象之间的交互,同时还...

    Java JDK代理、CGLIB、AspectJ代理分析比较

    ### Java代理技术详解:JDK代理、CGLIB与AspectJ #### 一、代理模式简介 代理模式是一种常见的设计模式,在《Design Patterns in Java》一书中对其有明确的定义:“代理模式为一个对象提供一个代理,以控制对该...

    java动态代理

    #### 二、Java动态代理的基本原理 Java动态代理的核心是`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。下面详细介绍这两个核心组成部分: 1. **`Proxy`类**:提供了一系列静态方法...

    java动态代理新java动态代理新java动态代理新

    #### 二、Java动态代理原理 Java动态代理的核心类主要有两个:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。 1. **Proxy**:这是一个工具类,用于创建一个实现了一组给定接口的动态代理...

Global site tag (gtag.js) - Google Analytics