《Java核心技术面试精讲》24讲学习总结
第24讲心得
该讲介绍了哪些方法可以在运行时动态生成一个 Java 类。
- 我们来理解一下,类从字节码到 Class 对象的转换,在类加载过程中,这一步是通过下面的方法提供的功能,或者 defineClass 的其他本地对等实现。 protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) protected final Class<?> defineClass(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain)
- 从相对实用的角度思考一下,实现一个简单的动态代理,都要做什么?如何使用字节码操纵技术,走通这个过程呢?对于一个普通的 Java 动态代理,其实现过程可以简化成为:提供一个基础的接口,作为被调用类型(com.mycorp.HelloImpl)和代理类之间的统一入口,如 com.mycorp.Hello。实现InvocationHandler,对代理对象方法的调用,会被分派到其 invoke 方法来真正实现动作。通过 Proxy 类,调用其 newProxyInstance 方法,生成一个实现了相应基础接口的代理类实例,可以看下面的方法签名。 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
- 字节码操纵技术,除了动态代理,还可以应用在什么地方?这个技术似乎离我们日常开发遥远,但其实已经深入到各个方面,也许很多你现在正在使用的框架、工具就应用该技术,下面是我能想到的几个常见领域。各种 Mock 框架ORM 框架IOC 容器部分 Profiler 工具,或者运行时诊断工具等生成形式化代码的工具。
