[改善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.
[改善Java代码]动态加载不适合数组的更多相关文章
- 透过现象看本质:Java类动态加载和热替换
摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...
- Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)
Posted on 2012-03-23 11:21 祥叔 阅读(2886) 评论(6) 编辑 收藏 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: 1. 内联样式 ...
- WPF中Style文件的引用——使用xaml代码或者C#代码动态加载
原文:WPF中Style文件的引用--使用xaml代码或者C#代码动态加载 WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观 ...
- Java的动态加载及其安全性问题
1.什么是动态加载 Class Loaders是动态加载Java类与Resource的一种机制.它支持Laziness,type-safe linkage,user-defined extensibi ...
- [转载] Java中动态加载jar文件和class文件
转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- java反射--动态加载
Class.forName("类的全称") 1)不仅表示类的类类型,还表示了动态加载类 2)请区分编译,运行 3)编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 比如下面: ...
- Java实现动态加载读取properties文件
问题: 当我们使用如下语句加载.properties时: ClassLoader classLoader = this.getClass().getClassLoader(); Properties ...
- 最简破解-java代码热加载热部署IDEA插件JRebel
如果经济实力允许的话,还是建议大家去购买收费版.支持原创作者,才能有更好的产品出现. 一.Jrebel插件介绍 JRebel一款帮助我们在开发过程中实现热加载的插件,目前来说,在IDEA中实现热加载最 ...
随机推荐
- BPL插件框架的二种实现
1)非RTTI方式适用于所有的DELPHI版本 unit untMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, ...
- Codeforces Round #271 (Div. 2) D. Flowers (递推)
题目链接:http://codeforces.com/problemset/problem/474/D 用RW组成字符串,要求w的个数要k个连续出现,R任意,问字符串长度为[a, b]时,字符串的种类 ...
- AppServ 配置还是成功了
安装就不说了,一键式安装,还不错. 首先,登陆密码吧,用户是root ,密码是空: 之前创建的databases都还在, 可以用phpmyadmin管理,不在输入复杂的命令了, 方便,继续鼓捣php.
- 发布方配ASP.NET网站服务器
方配ASP.NET网站服务器是一款简单,轻量,灵活的ASP.NET网站服务器,使用它可以无需安装复杂的IIS,直接就可以运行ASP.NET网站,使用非常简单,把exe文件拷贝到ASP.NET的网站目录 ...
- MX记录查询
nslookup set type=mx
- ssh 设置免password登录
如果: 实现->操作机A机 要以用户"user1"身份.免password登录B机和C机? B机和C机 建立用户 user1 而且能够ssh 登录. A机设置: 1.安装ss ...
- 修改 SVN 账户密码的方法
记是记不住 的,即便是每天都在用的东西,也有貌似熟悉其实很陌生的时候,或者说根本就是不熟悉.于是需要拿出来经常翻翻,比如我们的SVN账户配置,很简单的一个 case,你可能是svn使用高手,但不一定记 ...
- 【转】adns解析库——域名解析实例(C++、linux)
转自:http://blog.csdn.net/fty8788/article/details/7480334 adns是一个开源的dns解析库 官方文档:http://www.chiark.gree ...
- 怎么去掉li标签前面的点??
<ul class="list"> <li> </li> <li> </li> </ul> .list li ...
- 史上最浅显易懂的Git教程!
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000