Constructor类提供了对构造方法的操作方法,利用这些方法可以获取构造方法的参数、修饰符,并可以通过获取的构造方法实例化类。
获取构造方法的参数
应用Constructor类可以获取构造方法的参数个数、参数名称和参数类型。方法说明如下。
● String getName()
该方法用于获取构造方法的名称。
● int getParameterCount()
该方法用于获取构造方法参数的个数。
● Class<?>[] getParameterTypes()
该方法返回类对象数组,该数组按构造方法参数的声明顺序,包含了构造方法的参数类型。
案例1:建立ConstructorTest3测试类,获取Person类所有构造方法的名称、参数个数和参数名称。
在constructor包下新建ConstructorTest3测试类。代码如下:
package constructor;
import java.lang.reflect.Constructor;
/**
* @ClassName: ConstructorTest3
* @Description: 反射(使用获取的构造方法实例化类)案例2
* @author 编程训练营
* @date
*
*/
public class ConstructorTest3 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class)Person.class;
//通过class.getDeclaredConstructors获取所有构造方法
Constructor[] constructors1 = personClass.getDeclaredConstructors();
for (Constructor constructor : constructors1) {
System.out.println("-------构造方法-------");
System.out.println("构造方法名称:" + constructor.getName());
System.out.println("构造方法参数个数:" + constructor.getParameterCount());
// 如果是有参构造方法,输出构造方法的参数
if( constructor.getParameterCount() > 0 )
{
//通过constructor.getParameterTypes()获取参数类数组(Class)
Class[] paramClasses = constructor.getParameterTypes();
int nParamCount = 1;
for (Class paramClass : paramClasses) {
System.out.printf("参数%d:%s\n",nParamCount,paramClass.getName());
nParamCount++;
}
}
}
}
}ConstructorTest3程序首先应用Class类的getDeclaredConstructors()方法获取Person类的所有构造方法,然后输出每个构造方法的名称和参数个数,如果是有参构造方法,再应用Constructor类的getParameterTypes()方法获取该构造方法的所有参数,输出每个参数的名称。getParameterTypes()方法返回的是Class对象数组,数组的每个元素是参数的Class对象。
获取构造方法的修饰符
Constructor类的getModifiers()方法返回一个整数,该整数可用于Modifier类定义方法的传入参数。
Constructor类的getModifiers()方法说明如下。
● int getModifiers()
该方法返回一个整数,该整数可用于Modifier获取修饰符方法的传入参数。
Modifier类定义了多个静态方法用于获取当前对象修饰符信息,Modifier类的主要方法说明如下。
● boolean isPublic(int mod)
该方法用于判断当前对象是否使用public访问权限修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● boolean isProtected (int mod)
该方法用于判断当前对象是否使用protected访问权限修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● boolean isPrivate (int mod)
该方法用于判断当前对象是否使用private访问权限修饰符,如果是返回true,否则返回false。mod值对象的getModifiers()方法返回。
● boolean isStatic (int mod)
该方法用于判断当前对象是否使用static修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● boolean isFinal (int mod)
该方法用于判断当前对象是否使用static修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● boolean isAbstract (int mod)
该方法用于判断当前对象是否使用abstract修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● boolean isInterface (int mod)
该方法用于判断当前对象是否使用interface修饰符,如果是返回true,否则返回false。mod值由对象的getModifiers()方法返回。
● String toString (int mod)
该方法以字符串的方式返回当前对象的所有修饰符。mod值由对象的getModifiers()方法返回。
案例2:建立ConstructorTest4测试类,获取Person类所有构造方法的修饰符。
在constructor包下新建ConstructorTest4测试类。代码如下:
package constructor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
/**
* @ClassName: ConstructorTest4
* @Description: 反射(构造方法的相关操作)案例2
* @author 编程训练营
* @date
*
*/
public class ConstructorTest4 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
*
* @return void 返回类型 @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class) Person.class;
// 通过class.getDeclaredConstructors获取所有构造方法
Constructor[] constructors1 = personClass.getDeclaredConstructors();
for (Constructor constructor : constructors1) {
System.out.println("-------构造方法-------");
// 获取可以解析构造方法修饰符需要的整数
int mod = constructor.getModifiers();
System.out.println("构造方法的修饰符:" + Modifier.toString(mod));
}
}
}ConstructorTest4程序应用Constructor类getModifiers()方法,获取可以解析构造方法修饰符需要的整数,然后调用Modifier类的toString()方法以字符串方式输出构造方法的修饰符。
用构造方法实例化类
应用Constructor类可以应用构造方法来实例化类。实例化类方法说明如下:
● T newInstance(Object... initargs)
该方法用指定的参数创建该类的一个实例化对象,如果参数错误,会抛出IllegalArgumentException异常。
案例3:建立ConstructorTest5测试类,获取Person类的构造方法并实例化Person对象。
在constructor包下新建ConstructorTest5测试类。代码如下:
package constructor;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @ClassName: ConstructorTest5
* @Description: 反射(构造方法的相关操作)案例3
* @author 编程训练营
* @date
*
*/
public class ConstructorTest5 {
/**
* @Title: main
* @Description:Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class) Person.class;
// 获取指定参数类型具有public权限的构造方法
try {
Constructor paramConstructor = personClass.getConstructor(String.class, int.class);
//通过constructor.newInstance(args...)以指定构造方法进行对象实例化
Person person = (Person) paramConstructor.newInstance("张三", 36);
if( null != person )
{
System.out.println("person对象的哈希码:" + person.hashCode());
System.out.println("person对象的成员变量name:" + person.getName());
System.out.println("person对象的成员变量age:" + person.getAge());
}
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}ConstructorTest5程序应用Class类的getConstructor()方法获取指定参数的构造方法,然后调用Constructor类的newInstance()方法实例化Person对象。newInstance()方法会抛出IllegalArgumentException等异常,因此在程序中需要处理这些异常。
程序执行结果如下图所示:
