下面的案例将一步步的模拟jdk源码思路实现jdk动态代理。
一.原始思路
1.目标类
java
package com.example.demo2.b08;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/27 22:04
*/
public class b08 {
interface Foo{
void foo();
}
static class Target implements Foo{
@Override
public void foo() {
System.out.println("target foo");
}
}
public static void main(String[] params) {
Foo proxy = new $Proxy0();
proxy.foo();
}
}
2.代理类
java
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/27 22:06
*/
public class $Proxy0 implements b08.Foo {
@Override
public void foo() {
//功能增强
System.out.println("before....");
//调用目标
new Target().foo();
}
}
3.结果

二.初步改进
引入InvocationHandler接口,在创建代理的时候再定义实现,这样不用一开始就写死在代理类中。
1.接口
java
interface Foo{
void foo();
}
interface InvocationHandler{
void invoke();
}
2.目标类
java
static class Target implements Foo{
@Override
public void foo() {
System.out.println("target foo");
}
}
3.代理类
java
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
import com.example.demo2.b08.b08.InvocationHandler;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/27 22:06
*/
public class $Proxy0 implements b08.Foo {
private InvocationHandler h;
public $Proxy0(InvocationHandler h){
this.h = h;
}
@Override
public void foo() {
h.invoke();
}
}
4.主类
java
public static void main(String[] params) {
Foo proxy = new $Proxy0(new InvocationHandler() {
@Override
public void invoke() {
//功能增强
System.out.println("before....");
//调用目标
new Target().foo();
}
});
proxy.foo();
}
5.结果

三.改进二
如果有两个方法需要实现代理功能,上面的方法就不适用了。需要进一步改进,在调用invoke方法时候需要把方法信息传入,根据方法的信息执行对应的增强。
java
interface Foo{
void foo();
void bar();
}
interface InvocationHandler{
void invoke(Method method,Object[] args) throws Throwable;
}
static class Target implements Foo{
@Override
public void foo() {
System.out.println("target foo");
}
@Override
public void bar() {
System.out.println("target bar");
}
}
2.代理类
java
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
import com.example.demo2.b08.b08.InvocationHandler;
import java.lang.reflect.Method;
import com.example.demo2.b08.b08.Foo;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/10/27 22:06
*/
public class $Proxy0 implements b08.Foo {
private InvocationHandler h;
public $Proxy0(InvocationHandler h){
this.h = h;
}
@Override
public void foo() {
Method foo = null;
try {
foo = Foo.class.getMethod("foo");
h.invoke(foo,new Object[0]);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void bar() {
Method bar = null;
try {
bar = Foo.class.getMethod("bar");
h.invoke(bar,new Object[0]);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
3.主类
java
public static void main(String[] params) {
Foo proxy = new $Proxy0(new InvocationHandler() {
@Override
public void invoke(Method method, Object[] args) throws Throwable {
//功能增强
System.out.println("before....");
//调用目标
method.invoke(new Target(),args);
}
});
proxy.foo();
proxy.bar();
}
4.结果

上面是对源码的思路简单进行模拟,真实的源码实现比这更复杂,考虑的情况更多。