java虚拟机asm底层代码分析

java代码运行在虚拟机,虚拟机是如何运行java代码的?

首先虚拟机把数据和方法地址入栈,然后再出栈放置到局部变量。

数据和方法进入的栈,叫做操作数栈,是用来把指令和数据送入至cpu,来运行代码的堆栈。

cpu先把数据存入操作数栈中,然后在出栈,放入到局部变量表中。局部变量表暂存局部变量的内存池。

java虚拟机运行的是class文件,查看class文件指令,可以通过idea的view->show bytecode可以查看。记住一定要选中java文件,才行。

下面一个实例说明java class指令如何运行

java 虚拟机指令

使用重载避免过多修改客户代码

比如原先计算最大值有个方法,是根据字段id计算最大值

private Long getMaxId(String table){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select max(id) mid from " + table);
if(maps.size()>0){
Long mid = (Long) maps.get(0).get("MID");
return mid;
}else{
return 1L;
}
}

然后客户有很多调用了此代码。

后来有发现有需求要根据其他字段来计算最大值。

那么,是如果简单在上面方法上增加参数,就会导致调用方代码大量修改。

这时,可以保留上述方法,增加一个重载方法

private Long getMaxId(String table, String field){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select max("+field+") mid from " + table);
if(maps.size()>0){
Long mid = (Long) maps.get(0).get("MID");
return mid;
}else{
return 1L;
}
}

那么原来的方法,只需要调用次方法即可。

private Long getMaxId(String table){
return getMaxId(table,"id");
}

这样既避免了客户代码的大量修改,又避免了两个重载方法的代码重复冗余。