Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43144 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第24讲 | 有哪些方法可以在运行时动态生成一个Java类?

杨晓峰 2018-06-30
在开始今天的学习前,我建议你先复习一下专栏第 6 讲有关动态代理的内容。作为 Java 基础模块中的内容,考虑到不同基础的同学以及一个循序渐进的学习过程,我当时并没有在源码层面介绍动态代理的实现技术,仅进行了相应的技术比较。但是,有了上一讲的类加载的学习基础后,我想是时候该进行深入分析了。
今天我要问你的问题是,有哪些方法可以在运行时动态生成一个 Java 类?

典型回答

我们可以从常见的 Java 类来源分析,通常的开发过程是,开发者编写 Java 代码,调用 javac 编译成 class 文件,然后通过类加载机制载入 JVM,就成为应用运行时可以使用的 Java 类了。
从上面过程得到启发,其中一个直接的方式是从源码入手,可以利用 Java 程序生成一段源码,然后保存到文件等,下面就只需要解决编译问题了。
有一种笨办法,直接用 ProcessBuilder 之类启动 javac 进程,并指定上面生成的文件作为输入,进行编译。最后,再利用类加载器,在运行时加载即可。
前面的方法,本质上还是在当前程序进程之外编译的,那么还有没有不这么 low 的办法呢?
你可以考虑使用 Java Compiler API,这是 JDK 提供的标准 API,里面提供了与 javac 对等的编译器功能,具体请参考java.compiler相关文档。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 三口先生
    将资源消耗的这个实例,用动态代理的方式创建这个实例动态代理对象,在动态代理的invoke中添加新的需求。开始使用代理对象,不开启则使用原来的方法,因为动态代理是在运行时创建。所以是零消耗。

    作者回复: 不错

    2018-06-30
    31
  • tyson
    可以考虑用javaagent+字节码处理拦截方法进行统计:对httpclient中的方法进行拦截,增加header或者转发等进行统计。开启和关闭只要增加一个javaagent启动参数就行

    作者回复: 是的,我自己也是用Javaagent方案

    2018-07-03
    1
    21
  • 四阿哥
    老师,您这个专栏完结了还会不会出其他专栏,你的每一篇我起码要听三四遍,我都是咬文嚼字的听,非常有用,非常好的内功心法

    作者回复: 非常感谢,老学究感到很欣慰,希望能对未来实践有帮助,专栏形式更多的是解决知识点的问题,后续专栏还没开始思考

    2018-06-30
    3
  • 冯宇
    还可以基于JVM实现各种动态语言。比如groovy就是使用java开发的动态脚本语言

    作者回复: 不错,各种jvm语言也是一大亮点

    2018-09-30
    2
  • antipas
    无痕埋点原理就是这样。像注解类框架也用到了比如retrofit

    作者回复: 是的

    2018-06-30
    2
  • 西兹兹
    老师好, 请问"newProxyInstance 生成代理类实例的时候", 这里是用 hard-code生成字节码,
    为何您这里选用的是ASM的例子呢? 上文提到了JDK里ASM是用在LamdaFrom, 不是newProxyInstance里哦
    2019-11-11
  • 小美
    老师在讲一些知识的时候,会提及到前面相关的章节,觉得特别赞,可以提醒我们去复习前面的章节,不至于学了后面忘了前面~~老师时不时可以来一些这样的提醒😁
    2019-04-30
  • 多格
    1. Proxy.newProxyInstance
    2. Class<?> cl = getProxyClass0(loader, interfaces);
    3. private static final WeakCache<ClassLoader, Class<?>[], Class<?>>
            proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
    4.value = Objects.requireNonNull(valueFactory.apply(key, parameter));
    5.interfaceClass = Class.forName(intf.getName(), false, loader);
    6.Verify that the Class object actually represents an interface [限制只能是接口]
    7. byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
                    proxyName, interfaces, accessFlags);
    8.return defineClass0(loader, proxyName,
                                        proxyClassFile, 0, proxyClassFile.length);
    2019-04-10
  • 黄明恩
    所谓零开销是指哪部分开销,做个统计的开关逻辑不就好了,硬套动态代理来实现感觉有点
    2018-07-28
  • omegamiao
    请问老师,使用classloader动态加载的外部jar包,应该如何正确的卸载?已经加载到systemclassloader……通过反射urlclassloader的addurl方法加进去的

    作者回复: 加载到system classloader...我理解卸载不了

    2018-07-17
  • 胡馥春
    所有用到java反射的地方,底层都是采用了字节码操纵技术,老师,这么理解对吗?

    作者回复: 不是,Proxy这里是个特例,因为需要生成新的class

    2018-07-05
  • rivers
    希望作者能详细的讲下,javaassist等其他代理模式的使用,砍掉了很多内容,尽量考虑下水平有限的读者
    2018-07-02
收起评论
12
返回
顶部