动态代理

动态代理

定义一个接口类,并使用实现类实现了这个接口。当进行代理时,拦截器会拦截此接口类的请求,并自动调用invoke方法。由Proxy对象负责搭配接口和拦截器,一旦完成配置,proxy就可以使用接口类的方法,且会自动执行拦截器的invoke方法。

实例

接口类userService

1
2
3
4
public interface userService {
void adduser(String name);
void deleteuser(String name);
}

实现类userServiceImpl

1
2
3
4
5
6
7
8
9
10
11
public class userServiceImpl implements userService{
@Override
public void adduser(String name) {
System.out.println("已添加: "+name);
}

@Override
public void deleteuser(String name) {
System.out.println("已删除: "+name);
}
}

拦截器handler(需要继承InvocationHandler类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class handler implements InvocationHandler {
private Object targrt;

public handler(Object targrt) {
this.targrt = targrt;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("adduser")){
System.out.println("--正在添加用户--");
method.invoke(targrt,args);
System.out.println("--添加成功--");
}else {
System.out.println("--正在删除用户--");
method.invoke(targrt,args);
System.out.println("--删除成功--");
}
return null;
}
}

代理类proxy

1
2
3
4
5
6
7
8
9
public class proxy {
public static void main(String[] args) {
InvocationHandler handler = new handler(new userServiceImpl());
userService proxy =(userService) Proxy.newProxyInstance(proxy.class.getClassLoader(), new Class[]{userService.class}, handler);
proxy.adduser("dis");
proxy.deleteuser("ddis");
new userServiceImpl().adduser("dddis");
}
}

代理对象可以使用配置类的所以方法,且调用时自动调用拦截类处理,如果配置类实现类对象直接调用方法,则不会被拦截。

而拦截类handler传入的参数就是实现类对象,传入的原因的通过反射调用它原本的方法,就相当于是重写了

proxy.adduser("dis")->handler->handler.invoke


动态代理
http://xiaowu5.cn/2025/12/04/动态代理/
作者
5
发布于
2025年12月4日
许可协议
BY XIAOWU