原文链接:http://tutorials.jenkov.com/java-reflection/constructors.html
我们可以通过 Java 的 java.lang.reflect.Constructor 来观察 classes 的所有构造方法,也可以在程序运行时来实例化一个对象。本文将会带领大家了解有关 Java Constructor 对象的细节。
下面的这个 User 类是我用来进行代码演示的,一个简单的 Java Bean :
package test; import java.lang.reflect.Constructor; public class User { private String userName; private String password; private int age; private User() { } User(int age) { this.age = age; } public User(String userName) { this.userName = userName; } pprotected User(String userName, String password) { this.userName = userName; this.password = password; } public User(String userName, String password, int age) { this.userName = userName; this.password = password; this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
String className = "test.User"; Class aClass = Class.forName(className); Constructor[] constructors = aClass.getConstructors();注意:只能获得 public 的构造方法, private 、 protected 、包访问权限(就是不加修饰符的构造方法)的构造方法是得不到的。
Constructor constructorWithStringParam = aClass.getConstructor(new Class[] {String.class});
如果根据给定的参数找不到与之匹配的构造方法,比如说在上面的例子中,如果没有一个 public 的参数类型是 String 的构造方法,就会抛出一个 NoSuchMethodException 。
注意:在 new Class[] {} 时一定要注意参数的类型和顺序,如果 new Class[] {int.class, String.class, String.class} 这样就会抛出一个 java.lang.NoSuchMethodException因为我们并没有定义一个这样的构造方法:public User(int param1, String param2, String param3) 。
决定一个方法有两个因素:
1、方法名称
2、方法的参数
方法的参数又有三个要素:
1、参数的数量
2、参数的类型
3、参数的顺序
我们可以像这样来读取一个构造方法的参数类型:
Constructor constructor; // 以某种方式得到了一个 Constructor 的对象 Class[] parameterClasses = constructor.getParameterTypes();下面的代码可以循环的获得一个 class 的所有 public 的构造方法的所有 参数类型:
String className = "test.User"; Class aClass = Class.forName(className); Constructor[] constructors = aClass.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); Class[] parameterClasses = constructor.getParameterTypes(); if (parameterClasses != null && parameterClasses.length != 0) { for (Class paramClass : parameterClasses) { System.out.println("param type:" + paramClass.getSimpleName()); } } }
我们可以像这样来实例化一个 User 对象:
Object object = constructor.newInstance(new Class[] {String.class});
其实在这里我们通过调用的其实是下面的这个构造方法来 new 了一个对象:
public User(String userName) { this.userName = userName; }
Constructor.newInstance() 方法有一个变长数量的参数(可以没有参数,也可以有多个参数),但是我们必须精确地(包括参数的数量、类型、顺序)提供我们想要调用的构造方法的参数。