zoukankan      html  css  js  c++  java
  • [改善Java代码]动态加载不适合数组

    上一个建议解释了为什么要使用forName,本建议就说说哪些地方不适合使用动态加载.

    如果forName要加载一个类,那它必须是一个类------8中基本类型就排除在外.它们不是一个具体的类.

    其次它必须具有可追溯的类路径...否则就会报ClassNotFoundException.

    在Java中,数组是一个非常特殊的类,虽然它是一个类,单没有定义类路径.

    public class Client {
        public static void main(String[] args) throws Exception {
            String[] strs = new String[10];
            Class.forName("java.lang.String[]");//报错
            //Exception in thread "main" java.lang.ClassNotFoundException: java/lang/String[]
        }
    }

    上面的程序抛错...产生了ClassNotFoundException异常.

    数组虽然是一个类,在声明时可以定义为String[],但编译后会为不同的数组类型生成不同的类.

    在编码期,我们可以声明 一个变量为String[],但是经过编译器编译后就成为了[Ljava.lang.String.

    明白了这一点,再根据以上的表格可知,动态加载一个对象数组只要加载编译后的数组对象就可以了.

    看代码:

            //加载一个String数组
            Class.forName("[Ljava.lang.String;");
            //加载一个long数组
            Class.forName("[J");

    虽然以上代码可以动态加载一个数组类,但是这没有任何意义,因为它不能生成一个数组对象,也就是说以上代码只是把一个String类型的数组类和long类型的数组类加载到了内存中(如果内存中没有该类的话),并不能通过newInstance()方法生成一个实例对象,因为它没有定义数组的长度,在Java中数组是定长的,没有长度的数组是不允许存在的.

    既然反射不能定义一个数组,那如何动态加载一个数组?比如依据输入动态产生一个数组.其实可以是用户Array数组反射类来动态加载.

    看代码:

            //数组反射了
            String[] strs = (String[]) Array.newInstance(String.class, 8);
            //创建一个多维数组
            int[][] ints = (int[][]) Array.newInstance(int.class,2,3);

    因为数组比较特殊,要想动态创建和访问数组,基本的反射是无法实现的,于是Java就专门定义了一个Array数组反射工具类来实现动态探知数组的功能.

    通过反射操作数组使用Array类,不要采用通用的反射处理API.

  • 相关阅读:
    poj 2584 T-Shirt Gumbo (二分匹配)
    hdu 1757 A Simple Math Problem (乘法矩阵)
    矩阵之矩阵乘法(转载)
    poj 2239 Selecting Courses (二分匹配)
    hdu 3661 Assignments (贪心)
    hdu 1348 Wall (凸包)
    poj 2060 Taxi Cab Scheme (二分匹配)
    hdu 2202 最大三角形 (凸包)
    hdu 1577 WisKey的眼神 (数学几何)
    poj 1719 Shooting Contest (二分匹配)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5626171.html
Copyright © 2011-2022 走看看