您的位置:首页 > 编程语言 > Java开发

Java Reflection深入理解构造器(Constructor)

2018-02-22 22:08 513 查看
利用Java的反射机制你可以检查一个类的构造方法,并且可以在运行期创建一个对象。
这些功能都是通过java.lang.reflect.Constructor这个类实现的。

获取Constructor对象
通过Class对象来获取Constructor类的实例:

Class myClass = ...//获取Class对象
Constructor[] constructors = myClass.getConstructors(); // 根据Class对象获取Constructor数组

返回的Constructor数组包含每一个声明为公有的(Public)构造方法。

以下所有实例涉及到的MyObject.java类:

package com.lanhuigu.reflect.common;

public class MyObject {
/** 属性 */
private String userName;
private String password;

/** 构造器 */
public MyObject() {

}

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

public MyObject(String userName, String password) {
this.userName = userName;
this.password = password;
}

/** getter and setter methods */
public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}
}


eg:

package com.lanhuigu.reflect.constructors;

import com.lanhuigu.reflect.common.MyObject;

import java.lang.reflect.Constructor;

public class Test2 {
public static void main(String[] args) {
Class myClass = MyObject.class;
Constructor[] constructors = myClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
}
}
}

如果你知道你要访问的构造方法的方法参数类型,可以通过指定构造器参数类型列表来获取构造器:

Class myClass = ...//获取Class对象
Constructor constructor = myClass.getConstructor(new Class[]{String.class}); // 获取参数为String类型的构造器

如果没有指定的构造方法能满足匹配的方法参数则会抛出:NoSuchMethodException。

eg:

package com.lanhuigu.reflect.constructors;

import com.lanhuigu.reflect.common.MyObject;

import java.lang.reflect.Constructor;

public class Test3 {
public static void main(String[] args) throws NoSuchMethodException {
Class myClass = MyObject.class;
Constructor constructor = myClass.getConstructor(new Class[]{String.class});
}
}


构造方法参数

你可以通过如下方式获取指定构造方法的方法参数信息:

Constructor constructor = ... //获取Constructor对象
Class[] parameterTypes = constructor.getParameterTypes();

eg:

package com.lanhuigu.reflect.constructors;

import com.lanhuigu.reflect.common.MyObject;

import java.lang.reflect.Constructor;

public class Test4 {
public static void main(String[] args) throws NoSuchMethodException {
/** 获取Class对象 */
Class myClass = MyObject.class;
/** 获取对象中所有构造器 */
Constructor[] constructors = myClass.getConstructors();
/** 遍历构造器 */
for (int i = 0; i < constructors.length; i ++) {
Constructor constructor = constructors[i];
System.out.println("###########第"+(i+1)+"个构造器--start--###########");
/** 获取构造器中参数列表 */
Class[] parameterTypes = constructor.getParameterTypes();
for (Class type : parameterTypes) {
/** 循环打印构造器参数类型 */
System.out.println("构造器参数类型:"+type.getName());
}
System.out.println("###########第"+(i+1)+"个构造器--end--###########");
}
}
}

注意: 如果是无参构造器,constructor.getParameterTypes()获取返回值为空

利用Constructor对象实例化一个类,可以通过如下方法实例化一个类:

Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");

constructor.newInstance()方法的方法参数是一个可变参数列表,
但是当你调用构造方法的时候你必须提供精确的参数,即形参与实参必须一一对应。

在这个例子中构造方法需要一个String类型的参数,那我们在调用newInstance方法的时候就必须传入一个String类型的参数。
eg:

package com.lanhuigu.reflect.constructors;

import com.lanhuigu.reflect.common.MyObject;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test5 {
public static void main(String[] args) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException, InstantiationException {
/** 根据参数类型获取构造器 */
Constructor constructor = MyObject.class.getConstructor(new Class[]{String.class});
/** 根据构造器动态创建对象实例 */
MyObject myObject = (MyObject) constructor.newInstance("hello world");
/** 调用对象中属性的getter方法 */
System.out.println("userName:" + myObject.getUserName());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: