7.6.2 Java9增加的VarHandle
VarHandle
主要用于动态操作数组的元素或对象的成员变量。VarHandle
与MethodHandle
非常相似,它也需要通过MethodHandles
来获取实例,接下来调用VarHandle
的方法即可动态操作指定数组的元素或指定对象的成员变量。
程序示例
下面程序示范了VarHandle
的用法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| import java.lang.invoke.*; import java.util.Arrays;
class User { String name; static int MAX_AGE; } public class VarHandleTest { public static void main(String[] args)throws Throwable { String[] sa = new String[]{"Java", "Kotlin", "Go"}; VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class); boolean r = avh.compareAndSet(sa, 2, "Go", "Lua"); System.out.println(r); System.out.println(Arrays.toString(sa)); System.out.println(avh.get(sa, 1)); System.out.println(avh.getAndSet(sa, 2, "Swift")); System.out.println(Arrays.toString(sa));
VarHandle vh1 = MethodHandles.lookup().findVarHandle(User.class, "name", String.class); User user = new User(); System.out.println(vh1.get(user)); vh1.set(user, "孙悟空"); System.out.println(user.name); VarHandle vh2 = MethodHandles.lookup().findStaticVarHandle(User.class, "MAX_AGE", int.class); System.out.println(vh2.get()); vh2.set(100); System.out.println(User.MAX_AGE); } }
|
程序调用MethodHandles
类的静态方法可获取操作数组的VarHandle
对象,接下来程序可通过VarHandle
对象来操作数组的方法,包括比较并设置数组元素、获取并设置数组元素等。
VarHandle
既可设置实例变量的值,也可获取实例变量的值。
使用VarHandle
操作类变量与操作实例变量差别不大,区别只是类变量不需要对象,因此使用VarHandle
操作类变量时无须传入对象作为参数。
VarHandle
与MethodHandle
一样,它也是一种动态调用机制,当程序通过Methodhandles.Lookup
来获取成员变量时,可根据字符串名
称来获取成员变量,这个字符串名称同样可以是动态改变的,因此非常灵活。