反射概述
Java反射机制:
- 是指在运行时去获取一个类的变量和方法信息。
- 然后通过获取的信息来创建对象,调用方法的一种机制。
- 由于这种<动态性>,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
获取Class类的对象
案例:
//Student类
public class Student {
/**
* 成员变量:私有,默认,公共
*/
private String name;
int age;
public String address;
//构造方法:一个私有,一个默认,两个公共
public Student() {
}
private Student(String name) {
this.name = name;
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
/**
* 成员方法:一个私有,四个公共
*/
private void function() {
System.out.println("function");
}
public void method1() {
System.out.println("method");
}
public void method2(String s) {
System.out.println("method:" + s);
}
public String method3(String s, int i) {
return s + "," + i;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
//使用类的class属性获取该类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);
//一个类在内存中只有一个字节码文件对象
Class<Student> c2 = Student.class;
System.out.println(c1 == c2);
System.out.println("-------------------");
/*通过调用对象的getClass()方法,返回对象所属类的class对象
该方法是Object类中的方法,所有的Java对象都可以调用该方法*/
Student stu = new Student();
Class<? extends Student> c3 = stu.getClass();
System.out.println(c1 == c3);
System.out.println("-------------------");
//使用Class类中的静态方法forName(String className),返回对象所属类的class对象
Class<?> c4 = Class.forName("com.fanshe.Student");
System.out.println(c1 == c4);
}
}
运行结果:
class com.fanshe.Student
true
-------------------
true
-------------------
true
反射获取构造方法并使用
- getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
- getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
- getConstructor(参数列表):获取指定的公共构造函数对象
- getDeclaredConstructor(参数列表):获取指定的构造函数对象
- newInstance(参数):构造方法创建对象
- setAccessible(boolean flag):值为true时取消访问检查
练习:
public class Demo2 {
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("com.fanshe.Student");
//getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
Constructor<?>[] cons = c.getConstructors();
System.out.println("公共构造函数:");
for (Constructor<?> con : cons) {
System.out.println(con);
}
//getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
Constructor<?>[] dCons = c.getDeclaredConstructors();
System.out.println("所有构造函数:");
for (Constructor<?> dCon : dCons) {
System.out.println(dCon);
}
System.out.println("指定的公共构造函数1:");
//getConstructor():返回指定的公共构造函数的对象
//参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)
Constructor<?> con = c.getConstructor();
//公共构造函数的对象使用newInstance()创建实例对象
//newInstance():构造方法创建对象
Object obj = con.newInstance();
System.out.println(obj);
System.out.println("指定的公共构造函数2:");
//基本数据类型 也可以通过.class 得到对应的Class类型
System.out.println(c.getConstructor(String.class, int.class, String.class).newInstance(&