WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > Java 技术 > J2SE / 基础类

java.lang.Class中的getMethod方法这么奇怪呀,参数啥意思呀
[ 来源:ITWENKU 时间:2006-9-21 16:42:22 | 浏览:312人次 ]

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() + "." + 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 是 "<init>" 或 "<clinit>",则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):

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


参数:
name - 方法名
parameterTypes - 参数列表
返回:
与指定的 name 和 parameterTypes 匹配的 Method 对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法,或者方法名为 "<init>" 或 "<clinit>"
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("悟空","人和妖精都是妈生的,");

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

}

}

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


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

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

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




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


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

 相关文章
·java里的scanf("%d,%s",i,s)是哪个函数?
·JAVA中的,打印1-100的数字,的程序。
·java中的 从数字1加到100的程序
·我要怎样才能取出JavaBean的所有属性
·关于timer类的使用,如何在以下API代码中加入定期执行功能?
·请问java中怎么去查看库函数的源代码?

 推荐文章
你们帮我改一下这个程序,它的界面怎么没有!
程序为什么会出现这样的异常
Socket问题
finally的神秘问题
右移>>>的问题
如果一个类里的构造函数含有本身类的对象,那该怎么处理的或怎么理解的?
大家遇到过jvm coredump的情况吗
请教: JDBC怎么传一个数(字符串)给数据库?(调用数据库的function)
编写一个java程序
接口修饰符
求救:循环问题,在线等!!!
js里的document.write总是转到新的页面输出???
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.