Java动态代理是一种在运行时在程序中创建一个代理对象的功能。使用Java动态代理,我们可以在运行时动态的创建一个实现了一个或多个接口的代理类,该代理类可以代替实际类(即被代理类)与其他类交互,从而达到对实际类进行控制的目的。
Java动态代理的核心是InvocationHandler接口,它定义了一个invoke方法,当方法被调用时,会自动调用invoke方法。
下面是如何使用Java动态代理:
1.定义一个实现InvocationHandler接口的类
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName() + " executed");
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName() + " executed");
return result;
}
}
2.使用Proxy类的静态方法创建代理对象
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
参数说明:
-
loader:类加载器,用于加载动态代理类。
-
interfaces:被代理类实现的接口,用于指定代理类要实现哪些接口。
-
h:InvocationHandler接口的实例,用于实现代理方法的逻辑。
MyInvocationHandler handler = new MyInvocationHandler(new RealSubject());
ISubject subject = (ISubject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
new Class[]{ISubject.class},
handler);
3.使用代理对象调用方法
subject.request();
完整示例代码如下:
interface ISubject {
void request();
}
class RealSubject implements ISubject {
@Override
public void request() {
System.out.println("RealSubject.request()");
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName() + " executed");
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName() + " executed");
return result;
}
}
public class Test {
public static void main(String[] args) {
MyInvocationHandler handler = new MyInvocationHandler(new RealSubject());
ISubject subject = (ISubject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
new Class[]{ISubject.class},
handler);
subject.request();
}
}
输出结果为:
Before method request executed
RealSubject.request()
After method request executed