深度解析 Spring 源码:揭秘JDK动态代理的奥秘
// 假设有一个接口和实现类
public interface MyInterface {
void myMethod();
}
public class MyInterfaceImpl implements MyInterface {
@Override
public void myMethod() {
System.out.println("实现类的方法被调用");
}
}
// 使用JDK动态代理创建代理对象的示例
public class JdkDynamicProxyExample {
public static MyInterface createProxy(final MyInterface target) {
// 获取ClassLoader和接口数组
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
// 使用InvocationHandler创建代理
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在调用目标方法前可以添加自定义逻辑
System.out.println("调用方法前: " + method.getName());
Object result = method.invoke(target, args);
// 在调用目标方法后可以添加自定义逻辑
System.out.println("调用方法后: " + method.getName());
return result;
}
};
// 创建代理对象
return (MyInterface) Proxy.newProxyInstance(classLoader, interfaces, handler);
}
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl();
MyInterface proxy = createProxy(myInterface);
proxy.myMethod();
}
}
这段代码展示了如何使用Java的动态代理功能来创建一个代理对象。InvocationHandler
的invoke
方法会在代理对象的方法被调用时被触发,并且可以在这里添加自定义的逻辑。在main
方法中,我们创建了一个被代理的对象MyInterfaceImpl
的实例,并且通过createProxy
方法获取了它的代理对象,然后调用代理对象的myMethod
方法,此时会执行InvocationHandler
中定义的逻辑。
评论已关闭