打字猴:1.700447942e+09
1700447942 编写高质量代码:改善Java程序的151个建议 [:1700438178]
1700447943 编写高质量代码:改善Java程序的151个建议 建议105:动态加载不适合数组
1700447944
1700447945 上一个建议解释了为什么要使用forName,本建议就来说说哪些地方不适合使用动态加载。如果forName要加载一个类,那它首先必须是一个类—8个基本类型排除在外,它们不是一个具体的类;其次,它必须具有可追索的类路径,否则就会报ClassNotFoundException。
1700447946
1700447947 在Java中,数组是一个非常特殊的类,虽然它是一个类,但没有定义类路径,例如这样的代码:
1700447948
1700447949 public static void main(String[]args)throws Exception{
1700447950
1700447951 String[]strs=new String[10];
1700447952
1700447953 Class.forName(“java.lang.String[]”);
1700447954
1700447955 }
1700447956
1700447957 String[]是一个类型声明,它作为forName的参数应该也是可行的吧!但是非常遗憾,其运行结果如下:
1700447958
1700447959 Exception in thread”main”java.lang.ClassNotFoundException:java/lang/String[]
1700447960
1700447961 at java.lang.Class.forName0(Native Method)
1700447962
1700447963 at java.lang.Class.forName(Class.java:169)
1700447964
1700447965 at Client.main(Client.java:6)
1700447966
1700447967 产生ClassNotFoundException异常的原因是数组虽然是一个类,在声明时可以定义为String[],但编译器编译后会为不同的数组类型生成不同的类,具体如表7-2所示。
1700447968
1700447969
1700447970
1700447971
1700447972 在编码期,我们可以声明一个变量为String[],但是经过编译器编译后就成为了[Ljava.lang.String。明白了这一点,再根据以上的表格可知,动态加载一个对象数组只要加载编译后的数组对象就可以了,代码如下:
1700447973
1700447974 //加载一个String数组
1700447975
1700447976 Class.forName(”[Ljava.lang.String;”);
1700447977
1700447978 //加载一个long数组
1700447979
1700447980 Class.forName(”[J”);
1700447981
1700447982 虽然以上代码可以动态加载一个数组类,但是这没有任何意义,因为它不能生成一个数组对象,也就是说以上代码只是把一个String类型的数组类和long类型的数组类加载到了内存中(如果内存中没有该类的话),并不能通过newInstance方法生成一个实例对象,因为它没有定义数组的长度,在Java中数组是定长的,没有长度的数组是不允许存在的。
1700447983
1700447984 既然反射不能定义一个数组,那问题就来了:如何动态加载一个数组呢?比如依据输入动态产生一个数组。其实可以使用Array数组反射类来动态加载,代码如下:
1700447985
1700447986 //动态创建数组
1700447987
1700447988 String[]strs=(String[])Array.newInstance(String.class,8);
1700447989
1700447990 //创建一个多维数组
1700447991
[ 上一页 ]  [ :1.700447942e+09 ]  [ 下一页 ]