反射是一种新的创建对象、操作属性和方法的技术。
一共是三种:操作构造方法、操作方法和操作属性;这篇博客仅讨论构造方法。
下面是我们这篇博客所需要的类:
public class Student {
public String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
Student(int age){
}
public void doHomework() {
System.out.println(name+"正在做作业。。。。。。");
}
}
获取构造方法: 注意: 构造方法对应的class类为Constructor类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectTest {
public static void main(String[] args) {
Class clazz = Student.class;
try {
//1、仅获取public修饰的构造方法对应的Constructor对象
Constructor constructor = clazz.getConstructor();
System.out.println(constructor.getName());
Constructor [] constructors = clazz.getConstructors();
System.out.println(constructors.length);
constructor = clazz.getConstructor(String.class);
System.out.println(constructor.getName());
//2、不区分访问权限获取构造方法对应的Constructor对象
constructor = clazz.getDeclaredConstructor();
System.out.println(constructor.getName());
constructors = clazz.getDeclaredConstructors();
System.out.println(constructors.length);
constructor = clazz.getDeclaredConstructor(String.class);
System.out.println(constructor.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
- Constructor[] getConstrutors():返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。
- Constructor getConstrutor(Class<?>... parameterTypes):返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。
- Constructor<?>[] getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
- Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。
输出的信息如下:
查看构造方法信息:
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class ConstructionTest {
public static void main(String[] args) {
Class clazz = Student.class;
//查看构造方法
try {
Constructor constructor = clazz.getConstructor(String.class);
//获取声明Constructor对象对应构造方法的类的class对象
clazz = constructor.getDeclaringClass();
System.out.println(clazz);
//以整数形式返回Constructor对象表示的构造方法的修饰符
int mod = constructor.getModifiers();
String result = Modifier.toString(mod);
System.out.println(result);
//获取构造方法名
result = constructor.getName();
System.out.println(result);
//获取参数列表
Class [] types = constructor.getParameterTypes();
System.out.println(types.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
- Class<T> getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
- int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
- String getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
- Class<?>[] getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0。
- getConstructors()和getConstructor(Class<?>... parameterTypes)方法均无法获取非public类中默认无参构造方法对应的Constructor对象。
- getDeclaredConstructors()和getDeclaredConstructor(Class<?>... parameterTypes)方法可以获取非public类中默认无参构造方法对应的Constructor对象。
显示信息如下:
调用构造方法:
import java.lang.reflect.Constructor;
public class ConstructionTest {
public static void main(String[] args) {
Class clazz = Student.class;
//调用构造方法
try {
Constructor constructor = clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Student student = (Student) constructor.newInstance("Tom");
System.out.println(student.name);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
- void setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
- T newInstance(Object... initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。
显示信息如下: