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

     
     
  • 相关阅读:
    PowerDesigner中利用数据库表反向生成PDM(jdk必须是32位)
    Struts2 Web Project 实现中文、英语的切换
    一张图解决Struts2添加源码
    Struts2配置文件struts.xml的编辑自动提示代码功能
    Hibernate多对一(注解)
    SQL Server 日期和时间函数
    ORACLE日期时间函数大全
    ORACLE中函数MONTHS_BETWEEN的使用
    SQL经典面试题及答案
    SQL数据库面试题以及答案
  • 原文地址:https://www.cnblogs.com/xiaobaoa/p/12178521.html
Copyright © 2011-2022 走看看