概述
1、成员方法:
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。获得的方法跟变量一样是类层面上的,不是对象上的。
2、数组反射。
一、获取成员方法的步骤:
步骤一、获取Method对象(即方法对象)
利用Class对象来获取有四种方法:
- Method getMethod(Stringname, Class<?>... parameterTypes)返回一个 Method 对象,它反映此 Class对象所表示的类或接口的指定公共成员方法。参数name:表示的是方法名;后面的参数表示的是方法中的参数的类型;
- Method[] getMethods()返回一个包含某些Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
- Method getDeclaredMethod(Stringname, Class<?>... parameterTypes)返回一个 Method 对象,该对象反映此Class 对象所表示的类或接口的指定已声明方法。
- Method[] getDeclaredMethods()返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
步骤二、执行方法
调用Method类中的方法invoke()返回参数 args 在 obj 上指派该对象所表示方法的结果。
Object invoke(Object obj,Object... args)对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。其中obj 是从中调用底层方法的对象,args 是指用于方法调用的参数。
方法不同所传递的参数也不同:
- 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
- 如果底层方法所需的形参数为0,则所提供的 args 数组长度可以为 0 或 null。
- 如果底层方法是实例方法,则使用动态方法查找来调用它
- 如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
- 如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
注意:在jdk1.4里args是把多个参数放在数组中,在jdk1.5里面,args是参数1,参数2,……参数3。此外jdk1.5兼容jdk1.4,即,加入说参数是数组的话,就会产生歧义。产生歧义是因为基本类型的一维数组可以被当作Object类型,不能被当作Object[]类型使用,那么非基本类型的即可以被当作Object类型,,也可以当作Object[]类型。
那么这种歧义错误如何解决呢?
解决的办法有两种:
方法一、将数组对象强制转化为一个实体对象Object,
方法二、在嵌套一层Object数组;那么我们如果用代码来表示,
如下所示:
//获取Method对象
Method aMethod=Persons.class.getMethod("main",String[].class);
/*调用MainDemo类中的主函数main方法,因为main方法是静态的,所以,表示对象的参数为null*/
//方法一
aMethod.invoke(null,(Object)newString(){“aa”,”bb”,”cc”});
或
String[] tstr= newString(){“aa”,”bb”,”cc”};
aMethod.invoke(null,(Object)tstr);
//方法二
aMethod.invoke(null,newObect[]{new String(){“aa”,”bb”,”cc”}});
二、数组反射详解
数组反射用到的类是Array类。
此外具有相同维数和元素类型的数组属于同一个类型,即具有相同的Classs实例对象。代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class..如果要判断Class实例对象是不是数组,可以调用方法isArray()。
Array类的完整类名是java.lang.reflect。
Array 类提供了动态创建和访问 Java 数组的方法。Array 允许在执行 get 或 set 操作期间进行扩展转换,但如果发生收缩转换,则抛出 IllegalArgumentException。
Array类没有构造函数,他里面的方法都是静态的,主要分为三大类
第一类:获取
static Object get(Object array, int index) 返回指定数组对象中索引组件的值。
static boolean getBoolean(Object array, int index) 以 boolean 形式返回指定数组对象中索引组件的值。
static byte getByte(Objectarray, int index) 以 byte 形式返回指定数组对象中索引组件的值。
static char getChar(Objectarray, int index) 以 char 形式返回指定数组对象中索引组件的值。
static double getDouble(Object array, int index) 以 double 形式返回指定数组对象中索引组件的值。
static float getFloat(Object array, int index) 以 float 形式返回指定数组对象中索引组件的值。
static int getInt(Objectarray, int index) 以 int 形式返回指定数组对象中索引组件的值。
static int getLength(Objectarray) 以 int 形式返回指定数组对象的长度。
static long getLong(Objectarray, int index) 以 long 形式返回指定数组对象中索引组件的值。
static short getShort(Object array, int index) 以 short 形式返回指定数组对象中索引组件的值。
第二类:设置
static void set(Objectarray, int index, Object value) 将指定数组对象中索引组件的值设置为指定的新值。
static void setBoolean(Objectarray, int index, boolean z)将指定数组对象中索引组件的值设置为指定的 boolean 值。
static void setByte(Objectarray, int index, byte b) 将指定数组对象中索引组件的值设置为指定的 byte 值。
static void setChar(Objectarray, int index, char c) 将指定数组对象中索引组件的值设置为指定的 char 值。
static void setDouble(Objectarray, int index, double d)将指定数组对象中索引组件的值设置为指定的 double 值。
static void setFloat(Objectarray, int index, float f) 将指定数组对象中索引组件的值设置为指定的 float 值。
static void setInt(Objectarray, int index, int i) 将指定数组对象中索引组件的值设置为指定的 int 值。
static void setLong(Objectarray, int index, long l) 将指定数组对象中索引组件的值设置为指定的 long 值。
static void setShort(Objectarray, int index, short s) 将指定数组对象中索引组件的值设置为指定的 short 值。
第三类:创建数组
- static Object newInstance(Class<?>componentType, int... dimensions)创建一个具有指定的组件类型和维度的新数组。创建一个具有指定的组件类型和维度的新数组。如果 componentType 表示一个非数组类或接口,则新数组具有 dimensions.length 维度,并且将 componentType 作为其组件类型。如果componentType 表示一个数组类,则新数组的维数等于 dimensions.length 和 componentType 的维数的总和。在这种情况下,新数组的组件类型为 componentType 的组件类型。参数:componentType - 表示新数组的组件类型的 Class 对象;dimensions - 表示新数组维度的 int 数组。新数组的维数不能超过该实现所支持的数组维数(通常为 255)。
- static Object newInstance(Class<?>componentType, int length)创建一个具有指定的组件类型和长度的新数组。componentType - 表示新数组的组件类型的 Class 对象;length - 新数组的长度
参考代码如下:
//常见一维数组
String[] str=(String[])Array.newInstance(String.class, 5);
int[] num=(int[])Array.newInstance(int.class, 5);
System.out.println("String[]数组长度:"+str.length);
System.out.println("int[]数组长度"+num.length);
//创建二维数组
int[][] num1= (int[][])Array.newInstance(int.class, 2,3);
num1[0][0]=1;
num1[1][0]=3;
System.out.println("int[][]二维数组:"+Arrays.toString(num1[0]));
三、Arrays类概述
Arrays类与Array类不一样,他继承自java.util,不是继承自反射机制。
Arrays类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。
该类中的方法也都是静态的,主要分为几大类:查找,复制,排序,比较,分配,获取哈希码值,获取数组的字符串表现形式。