Javassist之内省与定制(四)

本章为上一章Javassist之内省与定制(三)的续章,两章的内容相关很大,请先阅读上一章的内容。

上一章我们介绍了Javassist方法体修改的部分方式,本章将介绍剩余的部分。

javassist.expr.NewExpr

一个NewExpr对象表示使用new操作符的对象创建(不包括数组创建)。如果发现对象创建,ExprEditor的edit()方法接收这个对象。NewExpr的replace方法接收表示要替换对象创建的语句或代码块的源代码文本。

在源代码文本中,以$开头的字符有着特殊的含义:

$0 null
$1,$2,... 构造方法的参数
$_ 对象创建的返回值。一个新创建的对象会被存储在这个变量中。
$r 创建的对象的类型
$sig 一个java.lang.Class的对象数组,它表示正式的参数类型。
$type 一个java.lang.Class对象,表示创建对象的类。
$proceed 一个执行初始对象创建的虚拟方法的名称。

其它的标识符例如,$w,$args$$一样可以使用。

javassist.expr.NewArray

一个NewArray对象表示使用new操作符的数组创建。如果发现数组创建,ExprEditor的edit()方法将会接收这个对象。NewArray的replace()方法接收表示要替换数组创建的语句或代码块的源文本。

在源文本中,以$开头的标识符有特殊的意义:

$0 null
$1,$2,... 每一个维度的大小
$_ 数组创建的返回值。一个新的创建的数组将会被存储在这个变量。
$r 创建的数组的类型。
$type 一个java.lang.Class对象,它表示创建数组的类。
$proceed 一个执行初始数组创建的虚拟方法的名称。

其它的标识符例如,$w,$args$$一样可以使用。

例如,如果数组创建的表达式如下,

String[][] s = new String[3][4];

那么$1$2各自的值为3和4。$3无法获取。

如果数组创建表达式如下,

String[][] s = new String[3][];

那么$1的值是3,而$2的值无法获取。

javassist.expr.Instanceof

一个Instanceof对象表示一个instanceof表达式。如果发现一个instanceof表达式,ExprEditor的edit()会接收这个对象。Instanceof的replace方法接收要替换表达式的语句或代码块的源文本。

在源代码文本中,以$开头的标识符有特殊的含义:

$0 null
$1 原本instanceof操作符左边的值
$_ 表达式的结果。$_的是boolean类型。
$r instanceof操作符右边的类型。
$type 一个java.lang.Class对象,表示instanceof操作符右边的类型。
$proceed 执行原instanceof表达式的虚拟方法的名称。它接收一个参数( java.lang.Object类型)。如果参数的类型是instanceof右边的类型,返回true,否则返回false。

其它的标识符例如,$w,$args$$一样可以使用。

javassist.expr.Cast

一个Cast对象,表示一个显式的类型转换表达式。如果发现显式的类型转换表达式,ExprEditor的edit()接收这个对象。Cast的replace()方法接收表示要替换表示的语句或代码块的源文本。

在源代码文本中,以$开头的标识符有特殊的饿含义:

$0 null
$1 显式转换的类型的值
$_ 表达式的结果。$_的类型是转换后的由()包围的类型。
$r 显式转换的类型,或者由()包围的类型。
$type 一个java.lang.Class对象,与$r相同。
$proceed 一个执行初始类型转换的虚拟方法的名称。它接收一个java.lang.Object类型的参数,返回原显式转换表达式转换后的结果。

​ 其它的标识符例如,$w,$args$$一样可以使用。

javassist.expr.Handler

一个Handler对象,表示try-catch语句的catch。如果发现catch,ExprEditor的edit()方法会接收这个对象。Handler的insertBefore()编译接收的源文本同时插入到catch语句的开始位置。

在源文本中,以$开头的标识符有如下含义:

$1 catch语句捕获的异常对象
$r catch语句捕获的异常对象的类型。它常用在强制转换表达式中。
$W 包装类型。它常用在强制转换表达式中。
$type 一个java.lang.Class对象,表示catch语句捕获的异常的类型。

如果新的异常对象被赋值给$1,它会作为被捕获的异常传给初始catch语句。

你可能感兴趣的:(Javassist之内省与定制(四))