Java反射02–Filed,Method,Constructor类
一Filed类常用方法
上一篇已经说过了Field对象的创建,下面回顾下,同时介绍下Filed类的常用方法。
测试类如下:
public class Car {
//四种不同权限修饰符的属性
public String publicProperty="publicProperty";
protected String protectedProperty="protectedProperty";
String defaultProperty="defaultProperty";
private String privateProperty="privateProperty";
//四种不同权限修饰符的方法
public void showPublicMethod(String record){
System.out.println("This is a Public Method"+record);
}
protected void showProtectedMethod(String record){
System.out.println("This is a Protected Method"+record);
}
void showDefaultMethod(String record){
System.out.println("This is a Default Method"+record);
}
private void showPrivateMethod(String record){
System.out.println("This is a Private Method"+record);
}
public Car(){
}
protected Car(String record){
this.publicProperty=record;
}
Car(Integer record){
}
private Car(String record1,Integer record2){
}
}
通过Car类的Class对象获取Car类中属性对应的Field对象
Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
//获取car类中所有权限修饰符为public的属性对应的Field对象
Field[] fields = carClass.getFields();
//获取car类中所有权限修饰符的属性对应的Field对象
Field[] declaredFields = carClass.getDeclaredFields();
//获取car类中指定名称的属性对应的Field对象
Field field01 = carClass.getDeclaredField("protectedProperty");
Field类常用方法
1 getName()方法获取属性名
2 get()方法,获取属性值,参数为实例化的Car对象
3 set()方法 设置属性值
4 getType() 获取属性的声明类型
//获取car类中指定名称的属性对应的Field对象
Field field01 = carClass.getDeclaredField("protectedProperty");
//设置暴力反射,否则权限不够,只能获取public的属性
field01.setAccessible(true);
//getName()方法获取属性名
String fieldName = field01.getName();
System.out.println("属性名为:"+fieldName);
//get()方法,获取属性值,参数为实例化的Car对象
Car car01 = new Car();
String str = (String) field01.get(car01);
System.out.println("car01的protectedProperty值为:"+str);
//set方法修改Car类的实例对象中属性protectedProperty的值
field01.set(car01,"修改后的protectedProperty属性值");
System.out.println("car01的protectedProperty值为:"+field01.get(car01));
//获取属性的声明类型
Class<?> type = field01.getType();
System.out.println(type);
属性名为:protectedProperty
car01的protectedProperty值为:protectedProperty
car01的protectedProperty值为:修改后的protectedProperty属性值
class java.lang.String
注意若获取或修改非public的属性值,需要设置暴力反射
否则会报错
Exception in thread "main" java.lang.IllegalAccessException: Class cn.yy.Reflection01_Class can not access a member of class cn.yy.testClassObject.Car with modifiers "protected"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Field.get(Field.java:390)
at cn.yy.Reflection01_Class.testField(Reflection01_Class.java:42)
at cn.yy.Reflection01_Class.main(Reflection01_Class.java:30)
二 Method类常用方法
获取Method对象
Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
//根据方法名获取Method对象
Method showDefaultMethod = carClass.getMethod("showPublicMethod");
//获取car类中所有public的方法对应的Method对象
Method[] methods = carClass.getMethods();
//获取car获取car类中所有方法对应的Method对象
Method[] declaredMethods = carClass.getDeclaredMethods();
可以看到,getMethods(),方法除了获取car类本身的public方法,还获取了继承自Object类的方法。
Method类常用方法
Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
Method showDefaultMethod = carClass.getDeclaredMethod("showDefaultMethod",String.class);
//当Method对象非public时,需要暴力破解才能执行
showDefaultMethod.setAccessible(true);
Car car01 = new Car();
String message="传入的参数";
//通过invoke方法执行car01中对应的方法
showDefaultMethod.invoke(car01,message);
//getName()获取方法名
System.out.println(showDefaultMethod.getName());
//获取参数类型
Class<?>[] parameterTypes = showDefaultMethod.getParameterTypes();
for (Class clazz:parameterTypes) {
System.out.println(clazz);
}
注意若获取非public的方法需要使用getDeclaredMethod。
否则报错:找不到方法
Exception in thread "main" java.lang.NoSuchMethodException: cn.yy.testClassObject.Car.showDefaultMethod(java.lang.String)
三 Constructor类常用方法
获取Constructor对象
Class<Car> carClass = (Class<Car>) Class.forName("cn.yy.testClassObject.Car");
Class<?> aClass = Class.forName("cn.yy.testClassObject.SUVCar");
Constructor<?>[] constructors = carClass.getConstructors();
Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors();
//因为构造函数时重载的,名称一样,因此通过参数类型 来获取指定的Constructor对象
Constructor<Car> stringParameterConstructor = carClass.getDeclaredConstructor(String.class);
Constructor对象常用方法
//因为构造函数时重载的,名称一样,因此通过参数类型 来获取指定的Constructor对象
Constructor<Car> stringParameterConstructor = carClass.getDeclaredConstructor(String.class);
stringParameterConstructor.setAccessible(true);
//通过newInstance方法创建Car类的实例对象
Car car02 = stringParameterConstructor.newInstance("传入构造函数的参数");
System.out.println(car02.publicProperty);
传入构造函数的参数