jdk动态代理是比较常用的一种代理实现,**它是基于接口的代理。它只能在运行时为接口生成代理对象,所有方法调用都通过一个统一的InvocationHandler处理,是Java标准库自带的代理机制。**核心要点:
-
必须要有接口
-
运行时动态生成
-
通过InvocationHandler统一拦截
-
JDK自带,无需第三方库
下面的案例简单的进行了实现。
1.接口
java
interface Foo{
void foo();
}
2.目标类
java
static class Target implements Foo{
public void foo(){
System.out.println("target foo");
}
}
3.jdk代理创建以及调用
java
//目标对象
Target target = new Target();
//用来加载在运行期间动态生成的字节码
ClassLoader loader = testJdkProxy.class.getClassLoader();
Foo proxy = (Foo) Proxy.newProxyInstance(loader,new Class[]{Foo.class},(p,method,params)->{
System.out.println("before");
//目标 方法(参数)
// 方法.invoke(目标,参数);
Object result = method.invoke(target,params);
System.out.println("after");
return result;//让代理返回目标方法执行的结果
});
proxy.foo();
1)创建目标对象
- 获取classLoader
3)生成代理对象
设置创建代理需要的参数,同时通过匿名内部类实现InvocationHandler里面的方法进行目标类方法调用前后的增强逻辑处理,目标类方法的调用是通过反射进行。最后返回调用结果。
4)代理对象调用目标方法进行增强
5)总体代码实现
java
package com.example.demo2.b07;
import java.lang.reflect.Proxy;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/25 22:21
*/
public class testJdkProxy {
interface Foo{
void foo();
}
static class Target implements Foo{
public void foo(){
System.out.println("target foo");
}
}
public static void main(String[] args) {
//目标对象
Target target = new Target();
//用来加载在运行期间动态生成的字节码
ClassLoader loader = testJdkProxy.class.getClassLoader();
Foo proxy = (Foo) Proxy.newProxyInstance(loader,new Class[]{Foo.class},(p,method,params)->{
System.out.println("before");
//目标 方法(参数)
// 方法.invoke(目标,参数);
Object result = method.invoke(target,params);
System.out.println("after");
return result;//让代理返回目标方法执行的结果
});
proxy.foo();
}
}
4.结果
对目标类的方法进行了前后增强。
