java反射(一)
一、原理
1.定义:
- 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
- 通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
2.原理:(重点:是运行时而不是编译时)
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
3.功能:
Java反射框架主要提供以下功能:
1. 在运行时判断任意一个对象所属的类;
2. 在运行时构造任意一个类的对象;
3. 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
4. 在运行时调用任意一个对象的方法
4.用途:
反射最重要的用途就是开发各种通用框架。
很多框架(比如Spring)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
IDE代码提示
当我们在使用IDE(如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。
5.注意事项
- 由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。
- 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
二、基本运用
1.动态Class对象(三种方法)
Class<?> cls = Car.class;
cls = Class.forName("com.cn.sum.reflect.Car");
cls = new Car().getClass();
2.调用构造方法创建实例
Class<?> cls = Car.class;
Car car = (Car) cls.newInstance();
3.获取属性
//1.公有属性
Field fieldDistance = cls.getField("distance");
int distance = fieldDistance.getInt(new Car());
//2.私有属性
Field fieldName = cls.getDeclaredField("name");
fieldName.setAccessible(true);
String name = fieldName.get(new Car()).toString();
4.获取方法
//1.公有方法
Method method1 = cls.getMethod("getNewCar", String.class);
String str = method1.invoke(new Car(), "old").toString();
//2.私有方法
Method method2 = cls.getDeclaredMethod("getTotalDistance", int.class);
method2.setAccessible(true);
int num = (Integer) method2.invoke(new Car(), 20);