A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 绿树林 中级黑马   /  2013-4-2 12:59  /  1292 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭华章 于 2013-4-2 20:51 编辑

通过上一个帖子,我知道了静态方法不需要对象调用,所以invoke里第一个参数是null。但是下面这个静态方法的invoke第一个参数可以是一个对象,通过测试,发现invoke(null,1)与invoke(t1,1)都可以正确执行。我想问下专家们,这两种有什么区别呢还是完全一样?
  1. package cn.itheima.day1;

  2. import java.lang.reflect.Method;

  3. public class Test {
  4.         public static void main(String[] args) throws Exception {
  5.                 Test t1=new Test();
  6.                 Method m=Class.forName("cn.itheima.day1.Test").getMethod("numAdd",int.class);
  7.                 System.out.println(m.invoke(t1, 1));//参数为实例对象的时候
  8. System.out.println(m.invoke(null, 1));//参数为null的时候
  9.         }
  10.         
  11.         public static int numAdd(int a){
  12.                 a++;
  13.                 return a;
  14.         }

  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

4 个回复

倒序浏览
文档说明:
//如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
//假如把static去掉,就会报NullPointerException异常.因为静态方法是属于类的。所以可以不用传具体某个对象

回复 使用道具 举报
你的t1指向的是new Test(),是这个类本身。
invoke方法调用的是传入的对象身上的特有方法。
类中的静态方法也算是这个对象中的特有方法。所以可以正确执行。
而当你参数为null的时候是直接调用的静态方法,所以也可以执行。
我是这样理解的
回复 使用道具 举报
  1. package cn.itcast.day1;

  2. import java.lang.reflect.Method;

  3. public class Test {
  4.        
  5.         static int x=0;
  6.         static int y=0;
  7.        
  8.         Test(int x){
  9.                 this.x=x;
  10.         }
  11.        
  12.         public static int numAdd(int a) {
  13.                 x=x+a;
  14.                 return x;
  15.         }
  16.        
  17.         public static void main(String[] args) throws Exception {
  18.                 Test t1 = new Test(1);
  19.                 Method m = Class.forName("cn.itcast.day1.Test").getMethod("numAdd",int.class);
  20.                 System.out.println(m.invoke(null, 1));// 参数为null的时候
  21.                 System.out.println(m.invoke(t1, 1));// 参数为实例对象的时候
  22.         }
  23. }
复制代码
刚开始疑惑为啥这俩结果不一样呢,现在懂了,谢谢。
回复 使用道具 举报
Method invok
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
哈哈,这都文档里面的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马