九个预定义Class对象
8个基本数据类型+void类型 都有Class对象
Class c=void.class;
Class c=boolean.class;
Class c=int.class;
Class c=char.class;
包装类用TYPE属性获取:
Integer.TYPE 获取Integer的Class对象
5由Class对象获取类的方法:
1//getMethod只返回public方法
//第一参数方法名 第二是方法参数
Method m=String.class.getMethod(“charAt”,int.class); 方法参数可以是Class数组,或可变参数
2//获取所有方法,包括私有!
Method[]methods=class.getDeclaredMethod(); 返回String类的方法数组,包括private
for(Method m:methods){print{m};} 遍历方法
3调用特定对象的方法
有自定义类 class Test{ 有两个方法:
int add(int p1,int p2){return p1+p2;}
String static void echo(String m){return m;}}
调用某个特定对象的方法,利用反射调用某个对象的方法,虽然上面获得了Test对象,但一般不用对象直接调用方法,而是用反射。
1获得方法对象
Method m= class.getMthod(“add”, int.class,int.class);
Method m2= class.getMthod(“echo”, String.class);
2利用Method对象的invoke(对象,Object数组参数或可变参数)方法来调用对象的方法,invoke方法返回Object类型,需要强制转化:
Integer i =(Integer)m.invoke(o, 4,5);
第一个参数是调用哪个对象的方法,第二个参数是向对象方法传递的参数,result是返回值。其真正类型是add方法的返回值,这里是Integer,需要强制转换!
4调用类的静态方法:调用类的静态echo方法
Method m2= class.getMthod(“echo”, String.class);
Integer i =(Integer)m.invoke(null, 4,5);
5调用一个类的静态main方法
invoke(Object o, Object...args) 如果传递一个Object数组,会将其拆开,除非只传一个Object对象。
main没有实现可变参数,只能接受一个String[]args数组参数
如果直接invoke(Object o, new String[]{“as”,”d”}),会将new String[]{“as”,”d”}当成一个Object数组,然后将它拆开成多个Object参数再传递给main方法,会出错。
应当:invoke(Object o, new Object[]{new String[]{“as”,”d”}}) 将String数组作为Object数组的第一个参数,拆开后就只有一个String数组参数!!
或者(Object)new String[]{“as”,”d”} 作为一个Object对象
class Student{
int age; String name;
public static void main(String[] arg){print(age+name+arg[0]);} }
class Test{
main(String[] arg){
//第一个参数传入类全名
Class class=Class.forName(arg[0]);
//获取该类main方法
Method mainMethod=class.getMethod(main,String[].class);
//调用main方法
mainMethod.invoke(null, new Object[]{new String[]{“as”,”d”}});
}}