1、什么是Java反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。 这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。
2、
3、获取Class对象,有4种方法
//
package com.test.reflection;
public class Student {
private String studentName;
public int studentAge;
public Student() {
}
private Student(String studentName) {
this.studentName = studentName;
}
}
//
// 1.通过字符串获取Class对象,这个字符串必须带上完整路径名
Class studentClass = Class.forName("com.test.reflection.Student");
// 2.通过类的class属性
Class studentClass2 = Student.class;
// 3.通过对象的getClass()函数
Student studentObject = new Student();
Class studentClass3 = studentObject.getClass();
//4.对于基本数据类型(如 int、double 等),可以通过包装类的 TYPE 字段来获取对应的 Class 对象。
Class<?> intClass = Integer.TYPE;
Class<?> doubleClass = Double.TYPE;
4、获取这个类的成员变量
getDeclaredFields用于获取所有声明的字段,包括公有字段和私有字段,getFields仅用来获取公有字段:
// 1.获取所有声明的字段
Field[] declaredFieldList = studentClass.getDeclaredFields();
for (Field declaredField : declaredFieldList) {
System.out.println("declared Field: " + declaredField);
}
// 2.获取所有公有的字段
Field[] fieldList = studentClass.getFields();
for (Field field : fieldList) {
System.out.println("field: " + field);
}
运行程序,输出如下:
//
declared Field: private java.lang.String com.test.reflection.Student.studentName
declared Field: public int com.test.reflection.Student.studentAge
field: public int com.test.reflection.Student.studentAge
5、获取构造方法
// 获取所有声明的构造方法
Constructor[] declaredConstructorList = studentClass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructorList) {
System.out.println("declared Constructor: " + declaredConstructor);
}
```plaintext
运行程序,输出如下:
declared Constructor: public com.test.reflection.Student()
declared Constructor: private com.test.reflection.Student(java.lang.String)
6、反射可以通过Class类动态创建类的实例。使用5中的构造方法创建对象
通常有两种方式:
1使用无参构造函数创建实例。
2使用带参构造函数创建实例。
如果类有一个无参构造函数,可以直接使用newInstance()方法创建对象
// 使用无参构造函数创建实例
Class studentClass = Class.forName("com.test.reflection.Student");
Constructor c1 = studentClass.getDeclaredConstructor()
Object s1 = c.newInstance();
// 使用含参构造函数创建实例
根据5中输出的信息可知Student类的含参构造方法的参数是String类型
Constructor c2 = studentClass.getDeclaredConstructor(String.class)
Object s2 = c2.newInstance(“torrentgz”)
7、Java反射创建对象效率高还是通过new创建对象的效率高?
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低
标签:反射,Java,reflection,Student,Constructor,test,机制,com,Class
From: https://www.cnblogs.com/torrentgz/p/18425603