四大神器之反射(二)

利用反射来操纵数组

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的反射机制,非常方便的就可以改变私有的属性值。

 
 

猜你喜欢

转载自www.cnblogs.com/xiaobaoa/p/12178521.html
今日推荐