美文网首页
java动态代理

java动态代理

作者: 机智的黑猫 | 来源:发表于2018-11-07 16:24 被阅读0次

最近学习asm框架顺便复习了下动态代理的相关知识,这里简单做一下记录。
java中动态代理注意通过proxy的newProxyInstance方法实现。
'''
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h){
//这里的实现就不细究了,有兴趣可以自己阅读源码
}
'''
入参为一个classloder对象,通常可以传入目标class的classloder,第二个参数通常为需要被代理实现的interface或者class方法。第三个则是代理实现类,用于处理动态代理生成的实现类的具体实现。

这里看一下InvocationHandler接口,只有一个invoke方法。当被动态代理的实现类的里面会返回当前被代理的对象,以及该对象
'''
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
'''
这边拿retrofit的create方法来具体分析一下
'''
public <T> T create(final Class<T> service) {
//判断service是否合法,动态代理理论上可以代理class或者interface,但是retrofit里要求必须是interface
Utils.validateServiceInterface(service);
//这边是判断是否要预处理,跟动态代理的实现关系不大,可以先忽略
if (validateEagerly) {
eagerlyValidateMethods(service);
}
//这里就是创建了一个动态代理的实例
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();

      @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
          throws Throwable {

//这里是InvocationHandler的实现,每当该代理实例的某个方法被调用的时候就会触发invoke方法,并在对应的参数里返回对应的方法。
// If the method is a method from Object then defer to normal invocation.
//这边是object的方法直接调用不干预
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
//这里是去根据不同的方法执行对应的逻辑,具体的内容就不分析了,这边主要是单独去记录动态代理的。后续如果retrofit的实现忘记的差不多了那再去写一篇retrofit的分析好了。
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
'''

总体而言动态代理在使用上有点像asm的简化版,前者是预先通过InvocationHandler的invoke方法来拦截并处理被代理对象的方法执行,而后者则是在编译期,拦截所有特定类包括方法执行,参数创建,内存分配在内的所有生命周期并对其做相应的字节码修改最后输出。

相关文章

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java基础巩固笔记(4)-代理

    标签: java Contents java基础巩固笔记(4)-代理概念动态代理创建动态类动态代理的工作原理面向切...

  • java 动态代理

    动态代理动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.la...

  • java随笔(十一)

    java动态代理源码分析,总结。java动态代理实现步骤: 通过阅读源码发现,动态生成代理对象$Proxy0,该对...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

网友评论

      本文标题:java动态代理

      本文链接:https://www.haomeiwen.com/subject/ktpttqtx.html