动态加载不适合数组

简介:

上一个建议解释了为什么要使用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.

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5626171.html,如需转载请自行联系原作者

相关文章
|
7月前
|
JavaScript
JS数组增删方法的原理,使用原型定义
JS数组增删方法的原理,使用原型定义
|
4月前
|
JavaScript 前端开发 算法
JS数组常用的方法用处
JS数组常用的方法用处【8月更文挑战第8天】
21 0
|
7月前
|
JavaScript 前端开发
js中改变this指向、动态指定函数 this 值的方法
js中改变this指向、动态指定函数 this 值的方法
|
7月前
|
开发框架 JSON 定位技术
uniapp中map组件动态加载marks标记
uniapp中map组件动态加载marks标记
646 5
|
存储 JavaScript 开发者
JS中数组常用方法及其作用
JS中数组常用方法及其作用
57 0
|
7月前
|
JavaScript
js数组的增删方法(含代码介绍)
js数组的增删方法(含代码介绍)
|
7月前
|
JavaScript 索引
js之数组,对象,类数组对象
js之数组,对象,类数组对象
|
JavaScript
JS——根据对象数组的某个属性值找到指定的对象
JS——根据对象数组的某个属性值找到指定的对象
482 0
js引用值传递改变问题(使用深拷贝)
js引用值传递改变问题(使用深拷贝)
|
JavaScript 编译器 索引
如何在 TypeScript 中为对象动态添加属性?
如何在 TypeScript 中为对象动态添加属性?
1087 0