jdk 代理 代码案例
时间: 2023-12-10 19:15:06 浏览: 26
以下是一个简单的使用JDK代理的代码案例:
首先定义一个接口`Subject`:
```java
public interface Subject {
void doSomething();
}
```
然后定义一个实现该接口的类`RealSubject`:
```java
public class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("RealSubject doSomething");
}
}
```
接着定义一个实现`InvocationHandler`接口的代理类`ProxySubject`:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxySubject implements InvocationHandler {
private Object target;
public ProxySubject(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before doSomething");
Object result = method.invoke(target, args);
System.out.println("after doSomething");
return result;
}
}
```
在代理类中,我们将目标对象传入代理类的构造方法中,然后在`invoke`方法中实现增强逻辑,即在目标对象执行方法前后分别输出一些信息。
最后,在主函数中使用JDK代理来创建代理对象并调用方法:
```java
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
Subject subject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
proxySubject);
subject.doSomething();
}
}
```
输出结果为:
```
before doSomething
RealSubject doSomething
after doSomething
```
可以看到,在执行目标对象的`doSomething`方法前后,代理类分别输出了一些信息,说明代理类实现了对目标对象方法的增强。