JDK动态代理的一个最简单的实例

JDK动态代理大家都知道的有spring aop,它的实现就是基于JDK的动态代理,它只能对实现了接口的类实现代理,在程序运行过程中,根据代理的接口来动态生成代理类,如果要使用类的代理,就得使用cglib,我们另一篇文章进行说明。下面直接看一个最简单的实例代码
1:定义一个接口
public interface IUser {
void addUser();
}
2:定义接口的实现
import com.common.service.IUser;
public class UserImpl implements IUser {
public void addUser() {
// 这里是代码逻辑,我们省略,只打印一句话,做为演示
System.out.print("------------add user success----------");
}
}
3:实现代码类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.common.service.IUser;
import com.common.service.impl.UserImpl;
public class MyInvocation implements InvocationHandler {
private Object target;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 加入该对象执行之前的代码逻辑,这里我们只打印一句话,复杂的逻辑也是一样加在这里
System.out.print("对象执行之前的代码逻辑");

// 返回代理对象
Object resultObject = method.invoke(target, args);

// 加入该对象执行之后的代码逻辑,这里我们只打印一句话,复杂的逻辑也是一样加在这里
System.out.print("对象执行之后的代码逻辑");
return resultObject;
}
public MyInvocation(Object target) {
this.target = target;
}
}
4:测试代码是否正常
// 测试方法,也可以写在junit中
public static void main(String[] args) {
// 得到代理对象
MyInvocation myInvocationHandler = new MyInvocation(new UserImpl());
IUser proxy = (IUser) Proxy.newProxyInstance(MyInvocation.class.getClassLoader(),
new Class[] { IUser.class }, myInvocationHandler);
// 调用方法
proxy.addUser();
}
5:查看运行结果
对象执行之前的代码逻辑------------add user success----------对象执行之后的代码逻辑
发现在add方法执行前和执行后打印出来我们执行的代码。这只是一个最简单的实现,类似helloworld,如果有兴趣的话,可以再进行深入研究 。了解一个最简单的实现后再去研究会很有帮助的。


Java动态代理是一种在运行时动态生成代理对象的技术。它可以代理某个接口或者类,使得代理对象可以拦截到对被代理对象的方法调用,并在调用前后进行一些额外的操作,比如记录日志、权限控制等。 Java提供了两种动态代理的实现方式:基于JDK动态代理和基于CGLIB的动态代理。其中,基于JDK动态代理只能代理实现了接口的类,而基于CGLIB的动态代理则可以代理任何类,包括没有实现接口的类。 下面是一个基于JDK动态代理简单实例: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Hello { void sayHello(); } class HelloImpl implements Hello { public void sayHello() { System.out.println("Hello, world!"); } } class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before invoking " + method.getName()); Object result = method.invoke(target, args); System.out.println("After invoking " + method.getName()); return result; } } public class Main { public static void main(String[] args) { Hello hello = new HelloImpl(); InvocationHandler handler = new MyInvocationHandler(hello); Hello proxy = (Hello) Proxy.newProxyInstance( Main.class.getClassLoader(), new Class[] { Hello.class }, handler); proxy.sayHello(); } } ``` 这里定义了一个接口`Hello`和它的实现类`HelloImpl`。`MyInvocationHandler`是一个实现了`InvocationHandler`接口的类,它负责拦截并处理对`Hello`接口的方法调用。`Main`类中创建了一个`HelloImpl`对象和一个`MyInvocationHandler`对象,然后调用`Proxy.newProxyInstance`方法构造一个代理对象。通过代理对象调用`sayHello`方法时,`MyInvocationHandler`会先打印一行`Before invoking sayHello`,然后再调用`HelloImpl`对象的`sayHello`方法,最后打印一行`After invoking sayHello`。 下面是一个基于CGLIB的动态代理简单实例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; class Hello { public void sayHello() { System.out.println("Hello, world!"); } } class MyMethodInterceptor implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before invoking " + method.getName()); Object result = proxy.invokeSuper(obj, args); System.out.println("After invoking " + method.getName()); return result; } } public class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Hello.class); enhancer.setCallback(new MyMethodInterceptor()); Hello hello = (Hello) enhancer.create(); hello.sayHello(); } } ``` 这里定义了一个类`Hello`和它的一个方法`sayHello`。`MyMethodInterceptor`是一个实现了`MethodInterceptor`接口的类,它负责拦截并处理对`Hello`类的方法调用。`Main`类中创建了一个`Enhancer`对象,通过`setSuperclass`方法指定要代理的类,通过`setCallback`方法指定拦截器,然后调用`create`方法构造一个代理对象。通过代理对象调用`sayHello`方法时,`MyMethodInterceptor`会先打印一行`Before invoking sayHello`,然后再调用`Hello`对象的`sayHello`方法,最后打印一行`After invoking sayHello`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值