Java代码由JVM引擎加载类前端编译后的字节码去运行,整个程序的全局入口函数是main函数,Oracle官方的Hotspot规定这个public static void main(String[] args)必须放在一个public class里,然后JVM找遍了所有的ClassPath的.class,都没有发现一个public修饰的字节码,自然整个程序没有一个明确的入口...JVM肯定会抛出异常..,不是特别清楚题主确切想说什么。然而就算找到了一个public修饰的类的字节码,如果你里边没有写main方法,JVM照样也找不到一个确切的程序入口,跟第一种情况一样,预期就是,还是会抛异常。。

但是!但是! 就一定一定不能加载这个异常的字节码文件,一定一定不能执行这个异常的Java程序了吗?

世上过于绝对的事情还真的很少....

可以!

怎么搞呢? 修改字节码文件啊。。

怎么修改呢?AOP 啊!

天天IOC AOP的喊。。这个时候不就派上用场了吗

事实是Spring 的镇家之宝之一 AOP,是基于CGLIB,而CGLIB的底层是ASM

而至于你又问我ASM是啥? 额额...如果你不知道,这个就算家庭作业留你了

事实是,也不用搞的这么复杂的,远古时期猿们(Java猿)想修改字节码文件怎么办呢?

当然是手动修改啊!高手们往往直接修改字节码文件(高端的食材..啊呸.技术,往往需要非常细腻的手法..)要求是你必须对字节码结构和JVM指令非常熟悉,方能游刃有余,但是随着江湖功夫的发展,后辈们往往更加注重轻功水上漂和葵花点穴手,至于九阴真经..已经很少有人去习了.....额额。。扯远了回来。讲哪儿了来着。

对,最开始是直接去修改字节码文件,还有一种就是用Proxy,但是Proxy用反射invoke的效率又太低,而且Proxy又只能面向接口编程,这对软件架构设计些许是有些拘泥的。

另外一种,1.5之后提供了一个叫Instrument 的包,通过给你要执行的Java代码挂一个hook(钩子)程序,以此来达到修改字节码控制虚拟机行为,但是每次装入一个新类的时候,都必须执行一遍这段程序,即使这个类不需要改变,还是有弊端..

晴天一声霹雳响,我ASM终于闪亮登场!

ASM通过ClassReader类,这个类可以直接由字节数组或由 class 文件间接的获得字节码数据,它能正确的分析字节码,然后你就根据你自己的意愿开始AOP吧。把常规JVM执行都执行不了的(如题)AOP出花出来只要你愿意。。

如果你们线上的大型项目想要一些动态侵入(例:字节码注入,链路监控,执行路径分析等)

给你推荐一下阿里开源的一款动态字节码增强的FrameWork:

本人平时鼓弄些JVM周边,热爱开源,有想学Java的同学可以进一步关注,互相交流学习。

今天先扯这么多。。下线了