import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义一个接口
interface Hello {
void sayHello();
}
// 实现该接口的类
class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("Hello, world!");
}
}
// 自定义InvocationHandler,用于处理方法调用
class HelloInvocationHandler implements InvocationHandler {
private Object target;
public HelloInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName());
return result;
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
// 创建目标对象
Hello hello = new HelloImpl();
// 创建代理对象
Hello proxyInstance = (Hello) Proxy.newProxyInstance(
hello.getClass().getClassLoader(),
hello.getClass().getInterfaces(),
new HelloInvocationHandler(hello));
// 调用代理对象的方法
proxyInstance.sayHello();
}
}
Hello
,它包含一个方法 sayHello()
。HelloImpl
,在其中实现了 sayHello()
方法。InvocationHandler
类 HelloInvocationHandler
,它会在方法调用前后打印日志信息。构造函数接收一个目标对象,并在 invoke
方法中通过反射调用目标对象的方法。DynamicProxyDemo
类中,使用 Proxy.newProxyInstance
方法创建了一个代理对象。这个代理对象实现了与目标对象相同的接口,并且所有方法调用都会被转发给 HelloInvocationHandler
的 invoke
方法。sayHello()
方法,可以看到代理对象在调用前后的日志输出。这种方式就是 Java 动态代理的基本实现方式。
上一篇:java时间格式
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站