java动态代理的编码实现
时间: 2023-10-29 15:04:54 浏览: 38
Java动态代理是指在程序运行时动态地生成代理类,而不是在编译时就确定代理类。它可以使代码更加灵活,同时也减少了代码的冗余。
Java动态代理的实现需要用到两个类:Proxy和InvocationHandler。Proxy类提供了一个静态方法newProxyInstance,用于创建代理对象;InvocationHandler接口提供了一个invoke方法,用于处理代理对象的方法调用。
下面是一个简单的Java动态代理的实现示例:
1. 创建一个接口Subject,定义一个方法request:
public interface Subject {
void request();
}
2. 创建一个实现类RealSubject,实现Subject接口:
public class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject request");
}
}
3. 创建一个InvocationHandler实现类,用于处理代理对象的方法调用:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在代理对象调用方法前,可以执行一些操作
System.out.println("before invoke");
// 调用目标对象的方法
Object result = method.invoke(target, args);
// 在代理对象调用方法后,可以执行一些操作
System.out.println("after invoke");
return result;
}
}
4. 创建一个测试类,用于测试Java动态代理的实现:
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
// 创建目标对象
RealSubject realSubject = new RealSubject();
// 创建InvocationHandler实例
MyInvocationHandler handler = new MyInvocationHandler(realSubject);
// 创建代理对象
Subject proxySubject = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
RealSubject.class.getInterfaces(), handler);
// 调用代理对象的方法
proxySubject.request();
}
}
输出结果:
before invoke
RealSubject request
after invoke
可以看到,在代理对象调用方法前和调用方法后,都执行了一些操作。这就是Java动态代理的实现。