【Java】jdk1.8 Java代理模式,Jdk动态代理讲解(非常详细,附带class文件)
代理模式是常用的Java设计模式之一,其目的是为其他对象提供一个代理以控制对这个对象的访问。在Java中,代理模式通常有静态代理和动态代理两种实现方式。
静态代理:
- 代理类是在编译期就生成的。
- 代理类和目标类实现相同的接口。
- 代理类持有目标类的引用。
动态代理:
- 代理类是在运行期动态生成的。
- 使用Java的反射机制生成代理类。
- 动态代理类通常使用
java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口。
下面是一个使用JDK动态代理的简单示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class DynamicProxyExample {
interface Subject {
void doAction();
}
static class RealSubject implements Subject {
@Override
public void doAction() {
System.out.println("Real action performed.");
}
}
static class DynamicProxyHandler implements InvocationHandler {
private final Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before action: " + Arrays.toString(args));
Object result = method.invoke(target, args);
System.out.println("After action: " + result);
return result;
}
}
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler handler = new DynamicProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(), // 类加载器
new Class[]{Subject.class}, // 代理类需要实现的接口
handler // 调用处理器
);
proxySubject.doAction();
}
}
在这个例子中,我们定义了一个Subject
接口和一个实现了这个接口的RealSubject
类。DynamicProxyHandler
类实现了InvocationHandler
接口,用于处理代理实例上的方法调用。在main
方法中,我们创建了RealSubject
的代理实例,并调用了doAction
方法。代理会在doAction
调用前后打印出信息。
运行这个程序,你会看到在控制台上打印出了代理处理器中定义的信息,证明了代理模式的使用。
评论已关闭