Java Reflection-Constructors

来源:互联网 发布:json格式日志 编辑:程序博客网 时间:2024/05/17 21:50

原文链接: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;    }}

Obtaining Constructor Objects

可以通过 Class 对象累获取 Constructor ,下面是一个例子:
在 class 中所声明的每一个 public 构造方法都会在 Constructor[] 数组中有一个实例。
    String className = "test.User";    Class aClass = Class.forName(className);    Constructor[] constructors = aClass.getConstructors();
注意:只能获得 public 的构造方法, private 、 protected 、包访问权限(就是不加修饰符的构造方法)的构造方法是得不到的。

如果能明确的知道我们想要访问的那个构造方法的参数类型,我们就可以用下面的方式来获取到这个构造方法,而不是通过获取到所有的构造方法数组。这个例子返回了一个给定类的只有一个 String 类型参数的 public 构造方法:
    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 Parameters

我们可以像这样来读取一个构造方法的参数类型:

    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());            }        }    }

Instantiating Objects using Constructor Object

我们可以像这样来实例化一个 User 对象:

Object object = constructor.newInstance("test parameter");

其实在这里我们通过调用的其实是下面的这个构造方法来 new 了一个对象:

public User(String userName) {        this.userName = userName;}

Constructor.newInstance() 方法有一个变长数量的参数(可以没有参数,也可以有多个参数),但是我们必须精确地(包括参数的数量、类型、顺序)提供我们想要调用的构造方法的参数。




0 0
原创粉丝点击