黑马程序员技术交流社区

标题: 静态方法对象.invoke()的疑惑 [打印本页]

作者: 绿树林    时间: 2013-4-2 12:59
标题: 静态方法对象.invoke()的疑惑
本帖最后由 郭华章 于 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. }
复制代码

作者: 谢达    时间: 2013-4-2 13:57
文档说明:
//如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
//假如把static去掉,就会报NullPointerException异常.因为静态方法是属于类的。所以可以不用传具体某个对象


作者: 932759732    时间: 2013-4-2 15:25
你的t1指向的是new Test(),是这个类本身。
invoke方法调用的是传入的对象身上的特有方法。
类中的静态方法也算是这个对象中的特有方法。所以可以正确执行。
而当你参数为null的时候是直接调用的静态方法,所以也可以执行。
我是这样理解的
作者: 绿树林    时间: 2013-4-2 17:48
  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. }
复制代码
刚开始疑惑为啥这俩结果不一样呢,现在懂了,谢谢。
作者: 蓝色骨头    时间: 2013-4-2 19:13
Method invok
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
哈哈,这都文档里面的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2