反射②:调用构造方法、普通方法以及成员变量

 先获取一个类(如Student)

Class clazz = Student.class;

①获取构造方法:借助Class类某些可以获取对应类中声明的构造方法实例对象

//Test测试
//返回该对象表示类参数列表相匹配的public构造方法(不含继承)对应的Constructor对象 Constructor constructor = clazz.getConstructor();//public
//返回该对象表示类参数列表相匹配的构造方法(不区分访问权限)对应的Constructor对象 Constructor constructor = clazz.getDeclaredConstructor();//不区分访问权限//返回该对象表示类包含的所有public构造方法(不含继承)对应的Constructor对象数组 Constructor[] constructors= clazz.getConstructors();//public

//返回该对象表示类所声明所有的构造方法(不区分访问权限)对应的Constructor对象 constructors= clazz.getDeclaredConstructors();//不区分访问权限

②操作构造方法——获取构造方法信息

//获取一个构造方法
Constructor constructor = clazz.getConstructor();

//返回声明Constructor对象对应构造方法的类Class对象
clazz = constructor.getDeclaringClass();

//以整数形式返回Constructor对象表示的构造函数的修饰符
int mod = constructor.getModifiers();
String result = Modifier.toString(mod);//输出result即结果


//以字符串形式返回Constructor对象所表示的构造方法的名称
String res = constructor.getName();

//返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组,如果构造方法没有参数,则数组长度为0
Class [] types = constructor.getParameterTypes();

 ③操作构造方法——创建对象

Constructor constructor = clazz.getConstructor();

//调用构造函数是否忽略访问权限的影响,true忽略,false不忽略
constructor.setAccessible(true);

//使用Constructor对象表示的构造方法来创建声明该构造方法类的新对象,括号内为传入构造方法中的参数,如果没有则可设定为null或一个长度为0的数组
Object object = constructor.newInstance();

④获取普通方法:借助Class类某些可以获取对应类中声明的普通方法实例对象

//单个
//返回与该Class对象表示类或接口中方法形参类型相匹配的public方法的Method对象
Method method = clazz.getMethod("methodName",Type);//public 包括继承自父类的

//返回与该Class对象表示类或接口中方法名和方法形参类型相匹配方法(不含继承的)对应的Method对象。
method = clazz.getDeclaredMethod("doHomework",String.class);//忽略访问权限

//所有
//返回一个该Class对象表示类或接口中所有public方法(含继承的)对应的Method对象数组。
Method[] methods = clazz.getMethods();//所有public 含继承自父类的
//返回一个该Class对象表示类或接口内声明定义的所有访问权限的方法(不含继承的)对应的Method对象数组。
methods = clazz.getDeclaredMethods();//忽略访问权限  所有的

⑤操作普通方法——获取普通方法信息

//获取一个方法
Method method = clazz.getDeclaredMethod("name",Type);

//返回声明Method对象表示方法的类或接口的 Class 对象
method.getDeclaringClass();

//以整数形式返回此Method对象所表示方法的修饰符。
int mod = method.getModifiers();
String result = Modifier.toString(mod);
            
//返回Method对象所表示的方法的返回值类型所对应的Class对象
clazz = method.getReturnType();
    
//返回方法名
method.getName();/

//返回由Method对象代表方法的形参类型对应Class对象组成的数组
method.getParameterTypes();

⑥操作普通方法——调用普通方法

//获取方法
Method method = clazz.getDeclaredMethod("name",Type);

//调用方法时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
method.setAccessible(true);

//调用Method对象指代的方法并返回Object类型结果。obj表示该方法所在类实例,如果方法时静态的则obj可以指定为null; args表示传入该方法的参数,如果方法没有参数,则args数组长度可以为 0 或 null 。
Object obj = method.invoke(Object,Object);//反射不区分方法是否为静态非静态

⑦获取成员变量:借助Class类某些可以获取对应类中声明的成员变量实例对象

 

//单个
//返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象。
Field field = clazz.getField(String fieldName);//public

//返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组。
field = clazz.getDeclaredField(String fieldName);//所有

//返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组。
Field[] fields = clazz.getFields();

//返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组。
 fields = clazz.getDeclaredFields();

⑧操作成员变量——获取成员变量信息

Field field = clazz.getField(String fieldName);
//返回声明Field对象表示字段的类或接口所对应的Class对象。 
clazz = field.getDeclaringClass();

//返回Field对象表示字段的名称。
clazz = field.getName();

//返回Field对象所表示字段的数据类型所对应的Class对象。
clazz = field.getType();

//以整数形式返回Field对象表示的字段的修饰符
int mod = field.getModifiers();
String result = Field.toString(mod);

⑨操作成员变量——获取以及设置成员变量的值

 

Field field = clazz.getField(String fieldName);

//设置或获取属性值时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
field.setAccessible(true);


//返回Field表示字段的Object类型的值。obj为该属性所在类创建的对象,如果该属性是静态的,则可设置为null。
field.get(Object obj);//获取值

//为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null;value为该属性新值。
field.set(Object obj, Object value);//设置值

 

 

 

上一篇:反射


下一篇:深入拆解类加载器,这样的姿势你还不懂吗?