Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
构造函数声明包括名称,修饰符,参数和可抛出异常列表。java.lang.reflect.Constructor
类提供了获取此信息的方法。
示例说明了如何在类的声明构造函数中搜索具有给定类型的参数的构造函数。ConstructorSift
import java.lang.reflect.Constructor; import java.lang.reflect.Type; import static java.lang.System.out; public class ConstructorSift { public static void main(String... args) { try { Class<?> cArg = Class.forName(args[1]); Class<?> c = Class.forName(args[0]); Constructor[] allConstructors = c.getDeclaredConstructors(); for (Constructor ctor : allConstructors) { Class<?>[] pType = ctor.getParameterTypes(); for (int i = 0; i < pType.length; i++) { if (pType[i].equals(cArg)) { out.format("%s%n", ctor.toGenericString()); Type[] gpType = ctor.getGenericParameterTypes(); for (int j = 0; j < gpType.length; j++) { char ch = (pType[j].equals(cArg) ? '*' : ' '); out.format("%7c%s[%d]: %s%n", ch, "GenericParameterType", j, gpType[j]); } break; } } } // production code should handle this exception more gracefully } catch (ClassNotFoundException x) { x.printStackTrace(); } } }
Method.getGenericParameterTypes()
将参考
类文件中的签名属性(如果存在)。如果该属性不可用,则它会回退到 Method.getParameterType()
,这不会因引入泛型而更改。对于反射中的某些值 Foo,名称为 getGenericFoo()
的其他方法类似地实现。在 Class.getName()
中描述了 Method.get*Types()
的返回值的语法。
以下是 java.util.Formatter
中具有 Locale
参数的所有构造函数的输出。
$ java ConstructorSift java.util.Formatter java.util.Locale public java.util.Formatter(java.io.OutputStream,java.lang.String,java.util.Locale) throws java.io.UnsupportedEncodingException GenericParameterType[0]: class java.io.OutputStream GenericParameterType[1]: class java.lang.String *GenericParameterType[2]: class java.util.Locale public java.util.Formatter(java.lang.String,java.lang.String,java.util.Locale) throws java.io.FileNotFoundException,java.io.UnsupportedEncodingException GenericParameterType[0]: class java.lang.String GenericParameterType[1]: class java.lang.String *GenericParameterType[2]: class java.util.Locale public java.util.Formatter(java.lang.Appendable,java.util.Locale) GenericParameterType[0]: interface java.lang.Appendable *GenericParameterType[1]: class java.util.Locale public java.util.Formatter(java.util.Locale) *GenericParameterType[0]: class java.util.Locale public java.util.Formatter(java.io.File,java.lang.String,java.util.Locale) throws java.io.FileNotFoundException,java.io.UnsupportedEncodingException GenericParameterType[0]: class java.io.File GenericParameterType[1]: class java.lang.String *GenericParameterType[2]: class java.util.Locale
下一个示例输出说明了如何在 String
中搜索 char[]
类型的参数。
$ java ConstructorSift java.lang.String "[C" java.lang.String(int,int,char[]) GenericParameterType[0]: int GenericParameterType[1]: int *GenericParameterType[2]: class [C public java.lang.String(char[],int,int) *GenericParameterType[0]: class [C GenericParameterType[1]: int GenericParameterType[2]: int public java.lang.String(char[]) *GenericParameterType[0]: class [C
表达 Class.forName()
可接受的引用和基本类型数组的语法在 Class.getName()
中描述。请注意,第一个列出的构造函数是 package-private
,而不是 public
。返回它是因为示例代码使用 Class.getDeclaredConstructors()
而不是 Class.getConstructors()
,其仅返回 public
构造函数。
此示例显示搜索可变数量的参数(具有可变数量的参数)需要使用数组语法:
$ java ConstructorSift java.lang.ProcessBuilder "[Ljava.lang.String;" public java.lang.ProcessBuilder(java.lang.String[]) *GenericParameterType[0]: class [Ljava.lang.String;
这是源代码中 ProcessBuilder
构造函数的实际声明:
public ProcessBuilder(String... command)
该参数表示为 java.lang.String
类型的一维数组。这可以通过调用 Constructor.isVarArgs()
与显式为 java.lang.String
数组的参数区分开来。
最后一个示例报告了使用泛型参数类型声明的构造函数的输出:
$ java ConstructorSift java.util.HashMap java.util.Map public java.util.HashMap(java.util.Map<? extends K, ? extends V>) *GenericParameterType[0]: java.util.Map<? extends K, ? extends V>
可以以与方法类似的方式为构造函数获取异常类型。有关详细信息,请参阅 Obtaining Method Type Information 部分中描述的
示例。MethodSpy