Method代表一个类中的成员方法:
例如:
Method methodCharAt=String.class.getMethod("charAt", int.class);//获得String对象内部的参赛为int.class的charat()方法
methodCharAt.invoke(str1, 1); //创建String类型实例对象str1的参数为1的一个charat()方法的对象
System.out.println(methodCharAt.invoke(str1, 1));
若str1换为null则表示此methodCharAt是获得的类中的静态方法
System.out.println(methodCharAt.invoke(str1,new Object[]{2}));
//jdk1.4中的用法
实例:反射调用另一个类的main()方法;
//运行是要传入参数cn.itcast.day1.TestArguments
package cn.itcast.day1;
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception {
String startingClassName=args[0];//Main方法接收的字符串对象(另一个类的类名)
Method mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);//获得另一个类的mian方法
mainMethod.invoke(null,new Object[]{new String[]{"11","22","33"}});/*创建另一个类的参数为Object[]{new String[]{"11","22","33"}}的静态的main方法,这里的new String[]{"11","22","33"}会被拆开解释为三个字符串对象,使用Object[]{}包含后被拆开解释为一个数组对象。替换为mainMethod.invoke(null,(Object)new String[]{"11","22","33"});也可以实现*/
}
}
class TestArguments{
public static void main(String [] args){
for(String arg:args){
System.out.println(arg);
}
}
}
数组的反射及应用:
不同的类型,不同的维数则字节码不同
基本类型数组不能转换为object数组,例如:
int [] a=new int[2];
Object [] obj=a1;//不可以把a1转化成obj
int [] a5=new int[]{1,2,3}; //数组大括号中定义了元素,就不能在中括号中定义数组元素个数
输出查看数组:
String [] a4=new String[]{"a","b","c"};
int [] a5=new int[]{1,2,3}; //数组大括号中定义了元素,就不能在中括号中定义数组元素个数
System.out.println(Arrays.asList(a5));//…………
System.out.println(Arrays.asList(a4));//输出字符串数组[a, b, c]
读取数组中的元素:
实例:
package cn.itcast.day1;
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception {
printObject(new int[]{1,2,3});
printObject("xyz");
}
private static void printObject(Object obj) {
Class clazz=obj.getClass();//得到obj的字节码
if(clazz.isArray()){//判断是否是数
int len=Array.getLength(obj);//获得数组obj的长度
for(int i=0;i<len;i++){
System.out.println(Array.get(obj, i));//获得数组obj的第i个元素
}
}else{
System.out.println(obj);
}
}