`
canofy
  • 浏览: 831215 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

java动态代理的两种方法

    博客分类:
  • j2EE
阅读更多
动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还需要asm包。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

第一种通过jdk的动态代理(必须接口):
主类(实现主要方法的类)接口:
package bean;

public interface TestInter {
	public void save();
}

具体类:

package bean;

public class TestClass implements TestInter{
	public void save(){
		System.out.println("调用TestClass.save()");
	}
}

代理类:
package bean;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.log4j.Logger;

public class Test implements InvocationHandler {

	private Object originalObject;

	public Object bind(Object obj) {
	System.out.println("coming here...");
	this.originalObject = obj;
	return Proxy.newProxyInstance(
			obj.getClass().getClassLoader(),
			obj.getClass().getInterfaces(),this
		);
	}

	/**
	 * 反射?
	 */
	public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
		Object result=null;
		if(arg1.getName().startsWith("save")){
			    System.out.println("start...");
				result=arg1.invoke(this.originalObject,arg2);
				System.out.println("end...");
		}
		return result;
	}
}

测试类:
package bean;
public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test test=new Test();
		TestClass tc=new TestClass();	
		try{
			((TestInter)test.bind(tc)).save();
		}catch(Exception e){
			System.out.println(e.getMessage());
			e.printStackTrace();
			
		}		

	}

}

运行结果:
coming here...
start...
调用TestClass.save()
end...





第二种方法:

主类(实现主要方法的类):
package cglib;
public class TestClass {
	public void save(){
		System.out.println("调用TestClass.save()");
	}
}


拦截器类(实现功能的地方):
package cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 * 实现接口MethodInterceptor
 */
public class MyMethodInterceptor implements MethodInterceptor {

	
	/**
	 * 拦截器,在这里实现需要的功能
	 * 在这里仅仅是在执行之前打印了start 在执行之后打印了end
	 */
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		   System.out.println("start...");
	       Object result = arg3.invokeSuper(arg0,arg2);
	       System.out.println("ending...");
	       return result; 
	}

}


创建代理的类:
package cglib;

import net.sf.cglib.proxy.Enhancer;

public class TestProxy {
	/**
	 * 创建代理类
	 * @param targetClass
	 * @return
	 */
	public Object createProxy(Class targetClass){
        Enhancer enhancer = new Enhancer();
        //设定父类???
        enhancer.setSuperclass(targetClass);
        //这里貌似是进行回调,主要的操作被放进了MyMethodInterceptor类里
        enhancer.setCallback(new MyMethodInterceptor());
        return enhancer.create();
    } 
}


测试类
package cglib;

public class TestMain {

	/**
	 * 测试类
	 * @param args
	 */
	public static void main(String[] args) {
		TestClass tc=new TestClass();
		TestProxy tp=new TestProxy();
		
		TestClass tcp=(TestClass)tp.createProxy(tc.getClass());
		tcp.save();

	}

}


运行结果:
start...
调用TestClass.save()
ending...




分享到:
评论

相关推荐

    Java动态代理两种实现方式

    Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...

    java动态代理机制

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

    java 动态代理 简单实例

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

    java 动态代理 完整版

    Java提供了两种实现动态代理的方式: 1. **基于接口的动态代理**:利用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。适用于有接口的场景。 2. **基于子类的动态代理**:利用`java...

    Java实现动态代理

    在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...

    JAVA静态代理和动态代理

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

    动态代理和工厂方法例子

    Spring AOP提供了两种动态代理方式:JDK动态代理和CGLIB代理。前者基于接口,如果目标类实现了接口,Spring会使用JDK的动态代理;如果没有,Spring会转而使用CGLIB生成一个目标类的子类来实现代理。 总结来说,动态...

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

    在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    java动态代理例子

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码...理解并熟练运用这两种代理机制,能帮助我们在设计和实现复杂系统时更加游刃有余。

    Java中的动态代理

    动态代理分为两类:基于接口的代理(Java动态代理)和基于具体类的代理(CGLIB)。本文主要介绍基于接口的Java动态代理。 #### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java....

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

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

    java 简答可复用动态代理类

    Java动态代理是一种强大的技术,它允许我们在运行时创建对象,这些对象可以作为其他对象的代理,从而在调用实际方法之前或之后执行额外的操作。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

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

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

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

    本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...

    java动态代理

    在Java中,动态代理是一种非常重要的机制,它允许我们在运行时动态地创建一个接口的实现类实例。这种技术广泛应用于AOP(面向切面编程)、RPC(远程过程调用)等领域。通过动态代理,我们可以在不修改原有代码的情况...

Global site tag (gtag.js) - Google Analytics