反射②:调用构造方法普通方法以及成员变量
Posted yimengxianzhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射②:调用构造方法普通方法以及成员变量相关的知识,希望对你有一定的参考价值。
先获取一个类(如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);//设置值
以上是关于反射②:调用构造方法普通方法以及成员变量的主要内容,如果未能解决你的问题,请参考以下文章