利用反射来操纵数组
import java.lang.reflect.Array; /** * * 利用反射来操纵数组 */ public class ArrayTester { public static void main(String[] args) throws ClassNotFoundException { Class classType = Class.forName("java.lang.String"); Object array = Array.newInstance(classType, 10);//创建具有指定组件类型和尺寸的新数组。 Array.set(array,5,"hello"); String str =(String) Array.get(array,5); System.out.println(str); } }
我们可以注意到java.lang.reflect.array中可以对数组进行更改,创建数组。
对于二维甚至是三维数组,我们照样可以进行改变。
public class ArrayTester2 { public static void main(String[] args) { int[] dims = new int[]{5, 10, 15}; Object array = Array.newInstance(int.class, dims); Object arrayObj = Array.get(array, 3); //此时的arrayObj是一个二维数组 Class<?> cls = arrayObj.getClass().getComponentType(); arrayObj = Array.get(arrayObj, 5); //此时的arrayObj是一个一维数组 Array.set(arrayObj, 10, 37); int[][][] arrayCast = (int[][][]) array; System.out.println(arrayCast[3][5][10]); }
可以注意到,第8行已经是一个二维数组进行get取值,第13行是一个一维数组来进行取值。
这一些代码是为了在3维数组中 将第三第五和第十取值为37.
这里有一个面试题,如何在一个方法中改变私有的属性,提供get方法。
public class PrivateTest { private String name = "hello"; public String getName(){ return this.name; }
从上面这个类中如何改变name的属性值?
public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class<?> clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true); //压制java的访问控制检查 System.out.println(field.get(pt)); field.set(pt,"world"); System.out.println(pt.getName()); } }
上面代码中,关键的一点是需要压制java的访问控制检查,如果不去压制,那么将会访问不到那个属性值,也就无法
更改为world,这其中利用了Java的反射机制,非常方便的就可以改变私有的属性值。
原文地址:https://www.cnblogs.com/xiaobaoa/p/12178521.html
时间: 2024-10-17 22:41:11