for java beginner11 java 反射 Method类

java 反射 Method类

str1.charAt()
str2.charAt()

这个方法charAt()其实是字节码的,不是某不实例对象的

-------------------
package com.ncs;

import java.lang.reflect.Method;

public class ReflectTest {

public static void main(String[] args) throws Exception {
//测试用反射 得到 String的charAt()方法
String myStr = "hubin";

//第一个参数是 方法名字, 但是方法可以重载 所以还得给参数
//现在知道为什么 重载 和返回值无关,而和 参数 个数 和类型有关了吧
Method method = String.class.getMethod("charAt", int.class);

//method是String类里的一个方法,方法名字叫charAt,需要一个参数
//然后method这个实例有一个方法invoke ,说把自己 调 一下吧,需要一个参数哦
System.out.println(method.invoke(myStr, 1));

//output u OK!

//★如果method.invoke(null, 1)
//那么这个方法就是静态方法

//如果是1.4 ,传数组
//new int[]{1,2,3};
//new String[] {new String("abc"),new String("xyz"),new String("123")};

//new Object[]{2} //这个数组有一个元素 给你自动包装了 变Object


}
}

-----------------------[这里讲一个很有劲的事情]-----------------------

package com.ncs;

import java.lang.reflect.Method;

public class RunOtherClassMainMethod {

public static void main(String[] args) throws Exception {
HasMainMethod.main(new String[]{}); //这什么都不打
HasMainMethod.main(new String[]{"hu","bin"});
//这打了hu
//bin
/
//上面的不希奇,下面用反射
//为什么呢??神经病么??
/*----这里解释为什么用反射----------------
* 有这种情况,一个地方给你传了一个参数,是一个 类的名字
* 说,这个类里面有个main方法,执行它会有好东西出来,
* 现在只知道这个类的名字,怎么去new呢??
* 当然一定要new也是可以的,但是写死了
* 现在第二个地方也给你传了个类名,说这个里也有个main方法很好玩
* 那你在new第二个,有几亿个地方给你传呢?一个个new ,不现实
* 我们要写个通吃的方法
* 现在我们知道了,所有进来的类都有 个main 方法, 参数是 String[] 数组 那么好了
* Method method = HasMainMethod.class.getMethod("main", String[].class);
*
* method就可以代表那一亿个方法了
* 但是invoke的时候会出现问题,这不是程序的问题,是 1.4 1.5 兼容的问题,非常麻烦等下细说
*/


/*
Method method = HasMainMethod.class.getMethod("main", String[].class);
//现在method里有了方法了,怎么调,静态的,不需要传实例给它了
method.invoke(null, new String[]{"ma","xiao"});
*/


//上面的代码 会出现 wrong number of arguments
// 这是兼容的问题,不是 思想 上的问题
//★★★★★★★★★★
//上面的代码还有问题,HasMainMethod.class还是写死了,不可以这样写,
//要用下面的代码
Method method = Class.forName("com.ncs.HasMainMethod").getMethod("main", String[].class);
//这样就对了,"com.ncs.HasMainMethod"当然可以换成其他的
//比如 args[0],让你们传进来啊
//Class.forName(args[0]).getMethod("main", String[].class);

//method.invoke(null, new String[]{"ma","xiao"}); //★这思想是对的,但是版本问题,不允许了

//现在对了,然后还报 wrong number of arguments,下面详细说明
//::
//现在说参数的个数不对
//我要的方法我已经说了,它需要一个参数,那个参数是一个数组
//如果按照1.5的语法,是没有问题的
//但是SUN必须要考虑到老版本,
//老版本的语法,很多的时候拿到一个数组时,它会迈力的给你一个一个拆开
//而JVM又是按照老版本的方法执行的,
//所以这里我传的new String[]{"ma","xiao"}被它拆成两个参数了
//所以如果我只传一个,new String[]{"ma"},还是拆,说argument type mismatch,
//当然,需要的是数组,你给个字串当然 argument type mismatch

//怎么办,你既然要拆,那我最多再给你包一层,让你去拆吧
method.invoke(null, new Object[]{new String[]{"ma","xiao"}});
//这样,JVM一拆,拆出的一个数组,正是我想要的效果 run OK!

//还有一个方法
method.invoke(null, (Object)new String[]{"hello","world"});
//强制转成一个 Object 1.4不是看见数组参数就拆么?[数组的引用应该是不会拆的]
//现在 JVM看不见数组了,不拆了,run OK!

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值