一、 基础
反射:在运行状态时,可以通过反射获取自身的Class信息
一般情况下,我们都是通过类实例化对象。利用反射,可以从对象得到类的信息。
核心类:Class类
二、相关方法:
先写一个简单的类来演示。 Car.java
public class Car { private String brand; private String color; private int maxSpeed; public Car(String brand, String color, int maxSpeed) { this.brand = brand; this.color = color; this.maxSpeed = maxSpeed; } public Car() { }
public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } public void introduce(){ System.out.println("brand:"+brand+" color:"+color+" maxSpeed:"+maxSpeed); } }
Class 类
直接用Class: 比如 Car.Class
Class getClass() :通过对象获取Class
Class carClass=new Car().getClass();
Class<?> forName(String className): 通过类的路径实例化Class对象
T newInstance(): 获取Class类型的实例,注意: 被实例化的类必须存在无参的构造方法,否则会报错。
示例如下:
//通过反射进行对象的实例化
Class clazz=Class.forName("com.reflect.Car"); Car car=(Car)clazz.newInstance();
还可以通过类加载器获取Class,如下示:
//通过类加载器获取对象 ClassLoader loader=Thread.currentThread().getContextClassLoader(); Class<?> clazz=loader.loadClass("com.reflect.Car");
Field 属性
Field getDeclaredField(String fieldName) : Class类获取对应的属性类Field
field.setAccessible(true); 表示将属性Field设为可访问的,而非private
field.get(object) : 表示获取object对象中的field属性的值
field.set(object,value) : 表示设置object对象中的field属性的值
注意:如果field是用private修饰的,而且没有将field设置为可访问的,那么无法对field进行操作
示例如下:
public void setPropertyByField( ) throws Exception{ Class carClass= Class.forName("com.reflect.Car"); Car car=(Car)carClass.newInstance(); Field field=carClass.getDeclaredField("color"); //将私有化的属性设为可访问 field.setAccessible(true); field.set(car,"黑色"); //相当于car.color="黑色"; System.out.println("通过反射获取属性:"+ car.getColor()); }
Method 方法类
Method getMethod(String methodName,Class...parameterTypes)
作用:Class类获取对应的方法类Method。
参数解释:methodName: method的名称
parameterTypes:method的参数类型的列表(参数顺序需按声明method时的参数列表排列)
返回:符合method名称和参数的method对象
method.invoke(Object object, Object value);
参数解释: object 表示对象 , value表示 方法要设置的值
作用: 通过反射调用方法。第一个参数表示对象,第二个方法表示方法参数,如果有多个方法参数,可以写成 method.invoke(Object object, Object value,Object value);
示例如下:
/** * 通过反射调用方法 */ public static void setterByReflect() throws Exception{ Class<?> carClass=Class.forName("com.reflect.Car"); Car car=(Car)carClass.newInstance(); Method method=carClass.getMethod("setColor", String.class); method.invoke(car,"黑色"); System.out.println("通过反射调用方法的结果:"+car.getColor()); }
详细Demo代码见GitHub : https://github.com/firefoxer1992/JavaDemo/blob/master/src/main/java/com/reflect/CarReflect.java