- 通过类名可以获取该类下的属性,方法,构造方法等
- 动态地获取类的信息
- 运行的时候,获取类的信息并创建对象,调用方法
java.lang.Class
- JVM运行的时候,把类加载到内存中,同时也会自动为这个类创建一个Class类型的对象
- 该对象封装了类的所有信息,包括属性方法,构造方法等
- 通过getXXX方法,获取该Class类型对象的封装信息
如:
Class2.Class.forName(‘类的路径’)studentClass = Student.class;
如:
String className = "demo2.Student"; Class> aClass = Class.forName(className);3.对象.getClass();
如:
Student student = new Student(); Class c=student.getClass();反射常用方法
- 获取成员变量
- 获取属性
- 获取方法
- 获取构造方法
- 获取接口
- 获取内部类 等等
举例:
package demo2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class StudentTest {
public static void main(String[] args) throws ClassNotFoundException {
// 获取Class类型对象
// 类名.class
Class studentClass = Student.class;
// Class.forName("类的路径")
String className = "demo2.Student";
Class> aClass = Class.forName(className);//可能异常:类找不到,或者类不存在
System.out.println(aClass.getName());
// 对象
System.out.println("获取对象:");
Student student = new Student();
Class c=student.getClass();
// 获取成员变量
System.out.println("获取成员变量:");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
// 获取属性
System.out.println("获取成员属性:");
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
System.out.println(declaredFields);
System.out.println(declaredField.getName());
}
// 获取方法
System.out.println("获取成员方法:");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
// 获取构造方法
System.out.println("获取构造方法:");
Constructor>[] constructors = aClass.getConstructors();
for (Constructor> constructor : constructors) {
System.out.println(constructor);
}
// 获取接口
System.out.println("获取接口:");
Class>[] interfaces = aClass.getInterfaces();
for (Class> anInterface : interfaces) {
System.out.println(anInterface);
}
// 获取内部类
System.out.println("获取内部类:");
Class>[] declaredClasses = aClass.getDeclaredClasses();
for (Class> declaredClass : declaredClasses) {
System.out.println(declaredClass);
}
}
}
newInstance创建对象
使用时要求:
- 类必须已经记载运行在虚拟机中
- 类已经连接,需要Class.forName方法完成,不需要new方法创建
- new可以用有参构造和无参构造,强类型,效率高,可以调用任何public修饰的构造方法
- newInstance调用无参构造,弱类型,效率低
- 基于反射,对java.bean类属性事件的一种缺省处理方式
- 只要类中有setXxx,getXxx方法,其中get方法没有参数,有返回值,set方法中有参数无返回值
- 满足上面两点,内省机制认为Xxx是属性
- 首字母恢复小写



