获取构造方法必须借助于Class类的实例化对象,所以我们首先复习一下如何将class类对象实例化。
-
获取构造方法:
获取构造方法的方法有4种,虽然结构形式上很相似,但是也有不同之处,下面先将四种方法列上:
- 方法一:实例化对象.getConstrutors():
- 方法二:实例化对象.getConstrutor(Class<?>... parameterTypes):
- 方法三:实例化对象.getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
- 方法四:实例化对象.getDeclaredConstructor(Class<?>... parameterTypes):返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。
public class Student {
public String name ;
public Student() {
}
public Student(String name) {
this.name = name ;
}
public void dohomework(String name) {
System.out.println(name+"正在做作业......");
}
}
方法一:返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getConstructor();//获取构造方法
System.out.println(constructor.getName());//构造方法调用.getName,并输出。
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法二:返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getConstructor(String.class);//此时获取的构造方法,是对应参数列表相匹配的构造方法。
System.out.println(constructor.getName());//构造方法调用.getName,并输出。
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法三:返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getDeclaredConstructors();//此时获取的构造方法,无视访问权限,是对应参数列表相匹配的构造方法。
System.out.println(constructor.getName());//构造方法调用.getName,并输出。
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法四:返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getDeclaredConstructors(String.class);//此时获取的构造方法,无视访问权限,是对应参数列表相匹配的构造方法。
System.out.println(constructor.getName());//构造方法调用.getName,并输出。
} catch (Exception e) {
e.printStackTrace();
}
}
}
获取构造方法信息:
- .getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
- int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
- .getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
- .getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getConstructor(String.class);//获取构造方法
System.out.println(constructor.getDeclaringClass());//获取构造方法的类的class对象
String result =Modifier.toString(constructor.getModifiers());//获取构造方法的修饰符
System.out.println(result);
System.out.println(constructor.getName());
Class[] var =constructor.getParameterTypes();
for (Class ss : var) {
System.out.println(ss);//获取由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果如下:
创建对象:
newInstance(Object... initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。
setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
public class Test{
public static void main(string[] args){
Class clazz = Student.class;//
try {
Constructor constructor =clazz.getConstructor(String.class);
constructor.setAccessible(true);//无视访问权限,通过Boolean来控制。
Object object = constructor.newInstance("Jim");
Student student = (Student)object;
student.doHomework();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出如下结果.