打字猴:1.700447961e+09
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
1700447992 int[][]ints=(int[][])Array.newInstance(int.class,2,3);
1700447993
1700447994 因为数组比较特殊,要想动态创建和访问数组,基本的反射是无法实现的,“上帝对你关闭一扇门,同时会为你打开另外一扇窗”,于是Java就专门定义了一个Array数组反射工具类来实现动态探知数组的功能。
1700447995
1700447996 注意 通过反射操作数组使用Array类,不要采用通用的反射处理API。
1700447997
1700447998
1700447999
1700448000
1700448001 编写高质量代码:改善Java程序的151个建议 [:1700438179]
1700448002 编写高质量代码:改善Java程序的151个建议 建议106:动态代理可以使代理模式更加灵活
1700448003
1700448004 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发。我们知道一个静态代理是通过代理主题角色(Proxy)和具体主题角色(Real Subject)共同实现抽象主题角色(Subject)的逻辑的,只是代理主题角色把相关的执行逻辑委托给了具体主题角色而已,一个简单的静态代理如下所示:
1700448005
1700448006 //抽象主题角色
1700448007
1700448008 interface Subject{
1700448009
1700448010 //定义一个方法
[ 上一页 ]  [ :1.700447961e+09 ]  [ 下一页 ]