四大神器之反射
Posted xiaobaoa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四大神器之反射相关的知识,希望对你有一定的参考价值。
利用反射来操纵数组
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的反射机制,非常方便的就可以改变私有的属性值。
以上是关于四大神器之反射的主要内容,如果未能解决你的问题,请参考以下文章