zoukankan      html  css  js  c++  java
  • 四大神器之反射(二)

    利用反射来操纵数组

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

     
     
  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/xiaobaoa/p/12178521.html
Copyright © 2011-2022 走看看