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

使用cglib 实例

阅读更多
package com.ssc.gc.hook;

public interface Hook {
	public void hook();
}


package com.ssc.gc.hook;

import com.ssc.gc.hook.annotation.Surround;

public class ConcreateHook extends AbstractHook{
	
	@Surround
	public void hook(){
		super.hook();
		System.out.println("Concreate Hook run!");
	}
}



package com.ssc.gc.hook;

public interface Trigger {
	public void trigger();
}




package com.ssc.gc.hook;

public class ConcreateTrigger implements Trigger{

	@Override
	public void trigger() {
		
		System.out.println("Concreate Trigger run!");
		
	}

}



package com.ssc.gc.hook;

public class AbstractHook implements Hook{

	Trigger trigger;
	
	@Override
	public void hook() {
		System.out.println("abstractHook speak");
		trigger.trigger();
	}

	public Trigger getTrigger() {
		return trigger;
	}

	public void setTrigger(Trigger trigger) {
		this.trigger = trigger;
	}

}




package com.ssc.gc.hook.annotation;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target({ METHOD })
public @interface Surround {
	/**
    *
    */
	String name() default "";

	/**
    *
    */
	boolean required() default true;
}




package com.ssc.gc.hook.cglibproxy;

import java.lang.reflect.Method;

import com.ssc.gc.hook.annotation.Surround;

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

public class SurroundAnnoProxy implements MethodInterceptor{

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		Surround surround = method.getAnnotation(Surround.class);
		if(surround == null){
			return proxy.invokeSuper(obj, args);
		}
		
		System.out.println("do something after original object call");
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("do something after original object call");
		
		return result;
	}
	
}



package com.ssc.gc.hook;

import java.util.HashSet;
import java.util.Set;

import net.sf.cglib.proxy.Enhancer;

import org.junit.Test;

import cglib.CallBackObj;

import com.ssc.gc.hook.cglibproxy.SurroundAnnoProxy;
import com.ssc.gc.sample.metrics.MetricsMonitorProcessor;

public class HookClient {
	
	public static void main(String[] args) {
		Trigger trigger = new ConcreateTrigger();
		ConcreateHook hook = new ConcreateHook();
		hook.setTrigger(trigger);
		hook.hook();
	}
	
	@Test
	public void test1(){
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(ConcreateHook.class);
		enhancer.setInterfaces(getInterfaces(ConcreateHook.class).toArray(new Class<?>[0]));
		enhancer.setCallback(new SurroundAnnoProxy());
		ConcreateHook mmp = (ConcreateHook)enhancer.create();
		mmp.setTrigger(new ConcreateTrigger());
		mmp.hook();
	}

	private Set<Class<?>> getInterfaces(Class<?> clazz)
	{
		Set<Class<?>> interfaceList = new HashSet<Class<?>>();

		if (clazz.isInterface()) {
			interfaceList.add(clazz);
		}

		Class<?> superClass = clazz.getSuperclass();
		if (superClass != null) {
			interfaceList.addAll(getInterfaces(superClass));
		}

		Class<?>[] superInterfaces = clazz.getInterfaces();
		for (int i = 0; i < superInterfaces.length; i++) {
			Class<?> superInterface = superInterfaces[i];
			interfaceList.addAll(getInterfaces(superInterface));
		}

		return interfaceList;
	}
	
	
}	


分享到:
评论

相关推荐

    Java cglib实例代码

    Java CGLib 实例代码 Java CGLib 实例代码是 Java 中强大的三个特征:反射、Proxy 和元数据的...CGLib 是一个强大的工具,能够非常方便地实现 AOP 和 Decorator 模式,并且可以与 Spring 整合使用,实现强悍的框架。

    CGLIB入门实例.doc

    在实际应用中,如Hibernate等ORM框架广泛使用CGLIB来实现对Java对象的透明化持久化,提高了开发效率和灵活性。通过学习和熟练使用CGLIB,开发者可以更好地应对需要动态生成代码或增强已有类功能的挑战。

    cglib动态生成java类

    如果目标类实现了接口,CGLib会优先选择使用接口代理。CGLib的核心是ASM库,它能直接操作字节码,从而实现对类的动态生成和修改。 ### 动态代理的实现 1. **Enhancer**:CGLib中的核心类,用于创建代理对象。你可以...

    动态代理和cglib例子

    2. 使用CGLIB: - 引入CGLIB库,如在Maven项目中添加依赖。 - 创建Enhancer对象,设置被代理的目标对象和拦截器。 - 通过Enhancer的create()方法生成代理对象。 - 代理对象的调用会触发拦截器,实现功能增强。 ...

    cglib的依赖包

    下面我们将详细探讨CGlib的主要功能和使用方法: 1. **动态代理**:CGlib常被用作JDK动态代理的替代方案,特别是当处理的目标类没有实现接口时。通过创建目标类的子类,并在子类中拦截并增强方法调用,CGlib可以...

    cglib代理模式要使用的相关jar包

    本文将重点介绍使用CGLIB库实现的动态代理。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用,如Spring AOP。CGLIB通过字节码技术生成代理类,...

    cglib依赖功四个jar+java实例.rar

    CGlib,全称为Code Generation Library,是一个强大的、高性能的代码生成库,被广泛应用于Java...在"cglib依赖功四个jar+java实例.rar"中,你可以找到使用CGlib进行动态代理的完整示例,有助于深入理解和应用这一技术。

    cglib_cglib.zip

    在Spring中,如果你选择使用基于代理的事务管理,且目标类不实现接口,Spring就会默认使用CGLib来创建代理。通过代理,可以在方法调用前后插入额外的逻辑,如事务控制、性能监控等。 CGLib的使用通常涉及到以下几个...

    cglib_cglib3.2_remain3gr_cglibjar包_cglib.jar_

    【CGLib:强大的Java代码生成库】 CGLib(Code Generation Library)是一个强大的、高性能的代码生成库,它在运行期扩展Java类与实现Java接口。...正确理解和使用CGLib,能极大地提升开发效率和代码质量。

    Cglib3.3.0最新版jar包

    开发者在项目中引入此jar包,即可使用Cglib进行动态代理和类增强。 5. **cglib-nodep-3.3.0.jar**:此jar包与前者类似,但“nodep”意味着它不依赖于任何额外的库,如ASM。如果项目中已经包含了ASM库,那么可以选择...

    简单实现Cglib子类代理

    - 创建Enhancer实例:Enhancer是Cglib的核心类,它负责生成代理对象。 - 设置被代理的目标对象:通过setSuperclass()方法设置目标类的Class对象。 - 设置回调机制:通过setCallback()或setCallbacks()方法设置回...

    cglib所有jar包

    在Spring中,当目标类没有实现任何接口时,Spring会选择使用CGlib来创建代理,实现事务管理、日志记录等功能。此外,CGlib也被ORM框架如Hibernate用于动态生成实体类的代理,以便实现懒加载和其他优化策略。 总的来...

    CGLib3.2.5依赖包及源码

    2. **接口回调**:对于接口,CGLib可以使用`Enhancer`类配合`Callback`接口来创建代理对象。这种方式更加灵活,但要求目标类必须实现至少一个接口。 关键组件和接口包括: - **Enhancer**:这是CGLib的主要入口点...

    cglib-nodep

    当不支持接口的类需要被代理时,Spring会使用CGlib动态创建一个目标类的子类,并在子类的方法上插入拦截代码,从而实现切面逻辑。 2. **动态代理**: 对于没有实现接口的类,JDK的java.lang.reflect.Proxy无法直接...

    java动态代理实例(jdk动态代理和cglib)

    本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来了解一下JDK动态代理。JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义...

    深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站

    CGlib,全称为Code Generation Library,是一个强大的、高性能的代码生成库,被广泛应用于Java编程中,特别是面向切面...理解并掌握CGlib的工作原理和使用方式,对于提升Java开发中的面向切面编程能力具有重要意义。

    Spring cglib 中文说明

    - **net.sf.cglib.proxy.Enhancer:** 用于创建代理实例的核心类。它可以通过调用 `create()` 方法来创建代理对象。 #### 总结 CGLIB 是一个高度灵活且功能强大的代码生成库,特别适合于需要动态生成代理类的场景...

    CGLIB动态代理jar包

    在Java开发中,CGLIB经常被用作AOP(面向切面编程)的底层实现,例如Spring框架就使用了CGLIB来实现对目标类的动态代理。 CGLIB是通过字节码技术来实现动态代理的。当我们的应用程序需要动态地创建一个类的实例或者...

    cglib-2.0.2.jar

    3. **动态代理**:通过Enhancer类,我们可以指定要增强的类并提供拦截器,然后获取到这个动态生成的子类实例,这就是CGlib代理对象。 **CGlib-2.0.2版本特性** CGlib-2.0.2是CGlib的一个稳定版本,发布于较早的...

Global site tag (gtag.js) - Google Analytics