JAVA高新技术笔记4
成员方法的反射
- Method类代表某个类中的一个成员方法。这里并不是对象上的方法,而是类的、字节码上的方法。可以拿着这个方法去调用这个对象。
str1.charAt(),str2.charAt(),...方法和类是没有关系的而是属于类的,要想调用方法必须通过某个类去调用,所以先得到方法再针对某个对象去调用这个方法。
public Method getMethod(String name,
Class<?>... parameterTypes)
- str.charAt(1)是用普通的方法调用,用反射该怎么调用对象的charAt()方法呢?
//不管是成员变量还是方法,我们都需要先得到这个类的字节码,才可以谈得上去得到类的方法
//-----------成员方法的反射-----------------------------------
/*所以的类也对应一个大类是Class
* 这个方法是从String这个类身上来的,所以先获得String这个类的字节码,String.class
*然后拿出这个方法String.class.getMethod("charAt", int.class),
* 第一个参数是方法名字,这个类身上有多少个方法,用它来定位需要的方法。
* 第二个参数代表参数类型和参数个数,因为方法有重载的性质,用第二个参数来区别
* 每一个参数的类型都用一个Class来表示,一个数组类型
* "abcdefg".charAt(2);
*/
MethodmethodCharAt = String.class.getMethod("charAt", int.class);
//这里必须要明确一点,methodCharAt是Method类的一个对象,
//在调用这个对象的时候这样理解,画圆、刹车这些不是人在做,而是圆和车本身circle.draw();car.stop();
//这个方法也是一样,是在某个字符串对象上来调用的,调用时候穿什么参数
/*
* 方法.调用
*/
System.out.println(methodCharAt.invoke("abcdefg",2));
//如果有一个方法不通过对象就调用了,那么Method对应的是个静态方法
methodCharAt.invoke(null,1);
//-----------成员方法的反射-----------------------------------
/*所以的类也对应一个大类是Class
* 这个方法是从String这个类身上来的 ,所以先获得String这个类的字节码,String.class
* 然后拿出这个方法String.class.getMethod("charAt", int.class),
* 第一个参数是方法名字,这个类身上有多少个方法,用它来定位需要的方法。
* 第二个参数代表参数类型和参数个数,因为方法有重载的性质,用第二个参数来区别
* 每一个参数的类型都用一个Class来表示,一个数组类型
* "abcdefg".charAt(2);
*/
Method methodCharAt = String.class.getMethod("charAt", int.class);
//这里必须要明确一点,methodCharAt是Method类的一个对象,
//在调用这个对象的时候这样理解,画圆、刹车这些不是人在做,而是圆和车本身circle.draw();car.stop();
//这个方法也是一样,是在某个字符串对象上来调用的,调用时候穿什么参数
/*
* 方法.调用
*/
System.out.println(methodCharAt.invoke("abcdefg", 2));
//如果有一个方法不通过对象就调用了,那么Method对应的是个静态方法
//methodCharAt.invoke(null, 1);
//TestArguments.main(new String[]{"dsd","www"});
/*
* 在main方法的参数agrs中就代表所要启动的类,假设第一个参数args[0]就是要启动的类的名字
* 写程序的时候不知道要执行哪个类,也就是在程序执行时候动态复过去的
*/
String startingClassName = args[0];
/*
* 得到要执行的类的main方法,运行前,
* 先把 com.newTech.day0.TestArguments作为参数args[0]传给main,
* 也就是startingClassName的值
*/
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
/*
* main是静态的,方法实例作用的对象(第一个参数)为null,
* 反过来考虑也就是静态方法不需要由类创建的对象来调用,
* 而是由类直接调用。
* jdk1.5为了兼容1.4,会把传过来的参数打开,也就是"aaa","bbb","ccc"看作三个参数
* 就会不合法参数异常,解决办法是在外层再套一层。打开还是个整体
*
*/
mainMethod.invoke(null,new Object[] {new String[] {"aaa","bbb","ccc"}} );