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
1700448002
编写高质量代码:改善Java程序的151个建议 建议106:动态代理可以使代理模式更加灵活
1700448003
1700448004
Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发。我们知道一个静态代理是通过代理主题角色(Proxy)和具体主题角色(Real Subject)共同实现抽象主题角色(Subject)的逻辑的,只是代理主题角色把相关的执行逻辑委托给了具体主题角色而已,一个简单的静态代理如下所示:
1700448005
1700448006
//抽象主题角色
1700448007
1700448008
interface Subject{
1700448009
1700448010
//定义一个方法
1700448011
1700448012
public void request();
1700448013
1700448014
}
1700448015
1700448016
//具体主题角色
1700448017
1700448018
class RealSubject implements Subject{
1700448019
1700448020
//实现方法
1700448021
1700448022
public void request(){
1700448023
[
上一页 ]
[ :1.700447974e+09 ]
[
下一页 ]