反射中的成员方法

JAVA高新技术笔记4


成员方法的反射

  1. Method类代表某个类中的一个成员方法。这里并不是对象上的方法,而是类的、字节码上的方法。可以拿着这个方法去调用这个对象。

str1.charAt(),str2.charAt(),...方法和类是没有关系的而是属于类的,要想调用方法必须通过某个类去调用,所以先得到方法再针对某个对象去调用这个方法。

public Method getMethod(String name,
                       Class<?>... parameterTypes)
               

  1. 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"}} );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值