反射概述
java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译器就完成确定,在运行期间仍然可以扩展
获取Class类的对象
我们要想通过反射去使用一个类,首先我们要获取该类的字节码文件对象,也就是类型为Class类型的对象,提供三种方式获取Class类型的对象
①使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的class对象
②调用对象的getClass()方法,返回该对象所属类对应的Class 对象。(该方法是Object类中的方法,所有的Java对象都可以调用该方法)
③使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该i字符串参数是某类的全路径,也就是包含包名的路径。
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
Class<Student> studentClass = Student.class;
System.out.println(studentClass);
Class<Student> studentClass1 = Student.class;
System.out.println(studentClass==studentClass1);
System.out.println("---------------------");
Student student = new Student();
Class<? extends Student> aClass = student.getClass();
System.out.println(aClass);
System.out.println(aClass==studentClass);
System.out.println("---------------------");
Class<?> aClass1 = Class.forName("com.Student");
System.out.println(aClass1);
System.out.println(aClass1==studentClass);
}
}
反射获取构造方法并使用
- 方法
方法 | 说明 |
---|---|
getConstructors() | 返回一个包含Constructor对象的数组,Constructor对象反应了由该class对象表示的类的所有公共构造函数 |
getDeclaredConstructor() | 返回Class对象表示的类声明的所有构造函数 |
getConstructor(Class<?>... parameterTypes) | 返回一个Constructor对象,该对象反映Constructor对象表示的类的指定的公共构造函数 |
getDeclaredConstructor(Class<?>... parameterTypes) | 返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定构造函数。 |
获取指定构造函数方法的参数是要获取的构造方法的参数的个数和数据类型对应的字节码文件
public class Demo {
public static void main(String[] args) throws NoSuchMethodException {
Class<Student> studentClass = Student.class;
//获得公共构造函数
Constructor<?>[] constructors = studentClass.getConstructors();
for (Constructor con : constructors) {
System.out.println(con);
}
System.out.println("______________________");
//获取所有构造函数
Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
for (Constructor con : declaredConstructors) {
System.out.println(con);
}
System.out.println("______________________");
//获取指定公共构造函数
Constructor<Student> constructor = studentClass.getConstructor(String.class, int.class, String.class);
System.out.println(constructor);
//获取指定构造函数
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
}
}
通过得到的构造方法对象实例化对象
方法 | 说明 |
---|---|
newInstance() | 使用此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例 |
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<Student> studentClass = Student.class;
//获取指定构造函数
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class, String.class);
Student zzt = declaredConstructor.newInstance("zzt",24,"山东东营");
System.out.println(zzt);
}
}
方法 | 说明 |
---|---|
setAccessible(boolean flag) | 值为true时,取消访问检查(private修饰的构造方法可以使用) |
public class Demo {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<Student> studentClass = Student.class;
//获取指定构造函数
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Student zzt = declaredConstructor.newInstance("zzt");
System.out.println(zzt);
}
}
网友评论