动态代理,有两种情况,第一种是有接口的情况下,你可以选择为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提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...
Java提供了两种实现动态代理的方式: 1. **基于接口的动态代理**:利用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。适用于有接口的场景。 2. **基于子类的动态代理**:利用`java...
在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
Spring AOP提供了两种动态代理方式:JDK动态代理和CGLIB代理。前者基于接口,如果目标类实现了接口,Spring会使用JDK的动态代理;如果没有,Spring会转而使用CGLIB生成一个目标类的子类来实现代理。 总结来说,动态...
在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码...理解并熟练运用这两种代理机制,能帮助我们在设计和实现复杂系统时更加游刃有余。
动态代理分为两类:基于接口的代理(Java动态代理)和基于具体类的代理(CGLIB)。本文主要介绍基于接口的Java动态代理。 #### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java....
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
Java动态代理是一种强大的技术,它允许我们在运行时创建对象,这些对象可以作为其他对象的代理,从而在调用实际方法之前或之后执行额外的操作。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...
在Java中,动态代理是一种非常重要的机制,它允许我们在运行时动态地创建一个接口的实现类实例。这种技术广泛应用于AOP(面向切面编程)、RPC(远程过程调用)等领域。通过动态代理,我们可以在不修改原有代码的情况...