站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题java.lang.Class中的getMethod方法这么奇怪呀,参数啥意思呀

java.lang.Class中的getMethod方法这么奇怪呀,参数啥意思呀

摘要: java.lang.Class中的getMethod方法这么奇怪呀,参数啥意思呀


public Method getMethod(String name, Class ... parameterTypes)
throws NoSuchMethodException, SecurityException {
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
Method method = getMethod0(name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(getName() + -#34;.-#34; + name + argumentTypesToString(parameterTypes));
}
return method;
}

========================
怎么会是 Class ... parameterTypes,是什么意思?


public Method getMethod(String name,
Class... parameterTypes)
throws NoSuchMethodException,
SecurityException返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。
如果 name 是 -#34;-#60;init-#62;-#34; 或 -#34;-#60;clinit-#62;-#34;,则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):

在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C 类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形式参数类型,则它就是反映的方法。如果在 C 中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。
请参阅《Java Language Specification》的第 8.2 和 8.4 节。


参数:
name - 方法名
parameterTypes - 参数列表
返回:
与指定的 name 和 parameterTypes 匹配的 Method 对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法,或者方法名为 -#34;-#60;init-#62;-#34; 或 -#34;-#60;clinit-#62;-#34;
NullPointerException - 如果 name 为 null
SecurityException - 如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝访问方法
调用方的类加载器不同于也不是该类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包



靠,就知道复制,呵呵。

我只是问怎么有这么奇怪的写法,你回答的文不对题


Class ... parameterTypes

这个是1.5的特性
是用来替换Class[]


叫做可变长参数

有时候,我们传入到方法的参数的个数是不固定的,为了解决这个问题,我们一般采用下面的方法:

1. 重载,多重载几个方法,尽可能的满足参数的个数。显然这不是什么好办法。

2. 将参数作为一个数组传入。虽然这样我们只需一个方法即可,但是,为了传递这个数组,我们需要先声明一个数组,然后将参数一个一个加到数组中。



现在,我们可以使用可变长参数解决这个问题。

声明可变长参数方式如下:



public void mymethod(String arg1,Object… args)

也就是使用…将参数声明成可变长参数。

显然,可变长参数必须是最后一个参数。

请看下面唐僧师傅给悟空讲佛经的例子:

package com.kuaff.jdk5;



public class Varargs1

{

public void speak(String name,Object... arguments)

{

for(Object object : arguments)

{

System.out.println(object);

}



}

public static void main(String[] args)

{

Varargs1 va = new Varargs1();

va.speak(-#34;悟空-#34;,-#34;人和妖精都是妈生的,-#34;);

va.speak(-#34;悟空-#34;,-#34;不同的人是人他妈生的,-#34;,-#34;妖是妖他妈生的,-#34;);

}

}

其中speak中的参数被声明成可变长的参数,所以你可以传递给speak方法多个参数。


反射用的,
String name, Class ... parameterTypes

第一个参数确定了函数名字,

但是Java函数是支持重载的。
所以要第二个参数来确定是那个函数。




类类型,一般都用语反射中用,动态的获得对象的方法和属性等,reflect好象是这个包,至于...和楼上一个意思!
JDK1.5中可以把
public static void main(String[] args){}
--------
写成
public static void main(String... args){}


楼上几个大哥的回答都挺好


↑返回目录
前一篇: JAVA程序出错,java.lang.NoClassDefFoundError
后一篇: 想用JAVA做一个系统任务调度的软件,都用哪方面的内容呢?