本章为上一章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语句。