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

使用 cglib 代理的实现

阅读更多

package com.xiangsoft.proxytraining.bean;

import java.lang.reflect.Method;
import java.text.Annotation;
import java.util.Collections;
import java.util.List;

import com.xiangsoft.anno.Annotation1;

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


/**
 * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to
 * configure and extend Tapestry, or to place your own service definitions.
 */
public class CglibBean
{
	public <T> T proxyObject(Class<T> T)
	{
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(T);
		enhancer.setInterfaces(T.getInterfaces());
		enhancer.setCallback(new CallbackObj());

		return (T) enhancer.create();
	}
	
}

class CallbackObj implements MethodInterceptor{

	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		
		
		Annotation1 at =  method.getAnnotation(Annotation1.class);
		if(at == null){
			proxy.invokeSuper(obj, args);
			return null;
		}
		
		
		System.out.println(method.getName());
		System.out.println(args);
		System.out.println(proxy.getSuperName());
		
		return null;
	}
	
}





package com.xiangsoft.proxytraining.proxy;

import com.xiangsoft.anno.Annotation1;


/**
 * Start page of application proxytraining.
 */
public class Cat implements Eatable
{

	@Override
	public void eat() {
		System.out.println("cat eat...");
	}
	
	@Annotation1
	public void jump() {
		System.out.println("cat jump...");
	}
}





package com.xiangsoft.anno;

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

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

@Retention(RUNTIME)
@Target(ElementType.METHOD)
public @interface Annotation1 {
	/**
    *
    */
	String name() default "";

	String action() default "Hello World";
	/**
    *
    */
	boolean required() default true;
}



package com.xiangsoft.proxytraining.proxy;

public interface Eatable {
	
	public void eat();
}



package com.xiangsoft.mainborad;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.xiangsoft.proxytraining.bean.CglibBean;
import com.xiangsoft.proxytraining.proxy.Cat;

public class Mainboard extends JFrame{
	Cat mCat = null;
	private JPanel contentPane;
	
	public static void main(String[] args) {
			Mainboard mb = new Mainboard();
			mb.setVisible(true);
	}
	
	public Mainboard(){
        setTitle("设置窗体大小");// 设置窗体标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 默认关闭方式
        setSize(400,300);// 设置窗体大小
        contentPane=new JPanel();// 创建内容面板
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);// 设置内容面板
        JLabel label=new JLabel("宽度400,高度300"); // 创建标签控件
        contentPane.add(label,BorderLayout.CENTER);// 添加标签控件到窗体
        
        JButton jb = new JButton("代理测试");
        
        jb.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				CglibBean bean = new CglibBean();
				mCat =  bean.proxyObject(Cat.class);
				mCat.eat();
				System.out.println("action 1");
				mCat.jump();
				System.out.println("action 2");
			}});
        
        contentPane.add(jb,BorderLayout.EAST);
        
    }
}





引用


<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
    <properties>
    </properties>
   
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xiangsoft</groupId>
    <artifactId>proxytraining</artifactId>
    <version>1.0.1</version>
    <packaging>jar</packaging>
    <name>proxytraining</name>
   
    <dependencies>
       <dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency>
    </dependencies>
   
    <build>
        <finalName>proxytraining</finalName>
        <plugins>
        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-assembly-plugin</artifactId>
           <executions>
           <execution>
           <id>package-jar-with-dependencies</id>
           <phase>package</phase>
           <goals>
           <goal>single</goal>
           </goals>
             <configuration>
                     <appendAssemblyId>false</appendAssemblyId>
                     <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                     </descriptorRefs>
               </configuration>
           </execution>
           </executions>
        </plugin>
       </plugins>
    </build>


</project>



分享到:
评论

相关推荐

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

    以上就是CGLIB代理模式的基本原理和使用方法。CGLIB的动态代理在很多场景下都非常实用,例如在AOP框架中拦截方法执行,进行日志记录、性能监控、事务管理等。然而,由于CGLIB是基于继承的,所以如果目标类为final...

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

    使用Cglib代理的基本步骤如下: 1. 引入Cglib库,如spring-core或cglib-nodep。 2. 创建一个Enhancer对象,它是Cglib的核心,负责生成代理子类。 3. 设置回调函数,通常是MethodInterceptor接口的实现,定义代理行为...

    浅谈JDK动态代理与CGLIB代理去区别

    在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...

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

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    CGLib代理jar包

    使用CGLib代理的基本步骤如下: 1. 引入依赖:首先,你需要将这两个jar包引入到你的项目中,无论是Maven、Gradle还是传统的类路径管理方式。 2. 创建Enhancer对象:CGLib的代理功能主要通过Enhancer类来实现。...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面编程)和ORM(对象关系映射)框架中,如Spring和Hibernate广泛使用它来实现代理功能。 CGlib动态代理的工作原理是通过继承被代理的目标类来创建子类,...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

    CGLib代理模式用到的jar包

    CGLib代理主要分为两种类型:接口代理和类代理。对于实现了接口的类,CGLib可以像JDK的动态代理一样工作,但如果目标类没有实现任何接口,CGLib则可以通过生成目标类的子类来实现动态代理。CGLib的核心类包括...

    jdk与cglib动态代理与底层实现

    - **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...

    JDK动态代理和CGLIB代理

    使用CGLIB代理通常需要引入cglib库,然后通过`MethodInterceptor`接口和`Enhancer`类来实现。以下是一个CGLIB代理的例子: ```java import net.sf.cglib.proxy.Enhancer; import ...

    简单模拟spring cglib代理

    我们定义了一个MethodInterceptor,在该拦截器中,在目标方法调用前后输出了信息,并且调用了目标方法的代理实现。 需要注意的是,上述代码只是简单模拟,实际上Spring AOP的CGLIB代理可能涉及更复杂的逻辑,包括但...

    cglib代理jar包

    了解和掌握CGlib代理技术,能够极大地提升我们的代码复用性和可维护性,特别是在构建复杂的企业级应用时,CGlib代理能够帮助我们更好地实现面向切面的编程。 总的来说,`cloud-cglib.jar`这个压缩包中的CGlib库为...

    简单实现Cglib子类代理

    下面我们将详细讲解Cglib代理的工作原理以及如何在实际项目中使用。 1. **Cglib代理原理**: - Cglib通过ASM库动态生成一个子类,这个子类继承自目标类,并重写其中的方法。 - 在生成的子类中,每个被代理的方法...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Cglib代理是Spring AOP在无法使用JDK动态代理(例如代理的目标对象没有实现接口)时的另一种选择。Cglib是一个强大的、高性能的代码生成库,它基于ASM库来动态生成子类,从而实现对方法的拦截。当目标类是不可变的...

    基于MAVEN项目的CGLib动态代理原理及实现

    本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    Java提供了两种主要的代理实现方式:JDK静态代理和动态代理,另外还有第三方库如CGlib提供的代理实现。下面我们将详细探讨这些代理技术,并通过代码演示来理解它们的工作原理。 ### 1. JDK静态代理 静态代理是我们...

    Spring框架中JDK动态代理和cglib动态代理

    在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标对象没有实现接口,Spring 就会选择使用 CGLIB 动态代理。这种机制可以确保 Spring AOP 框架可以代理任何类型的对象,无论它是否...

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    动态代理和cglib例子

    动态代理和CGLIB在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)和增强对象功能方面。动态代理允许我们在不修改原始代码的情况下,为已有对象添加额外的功能,比如日志记录、性能监控等。而CGLIB...

Global site tag (gtag.js) - Google Analytics