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

先获取一个类(如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);//设置值

原文地址:https://www.cnblogs.com/yimengxianzhi/p/12163182.html

时间: 2024-08-01 08:06:44

反射②:调用构造方法、普通方法以及成员变量的相关文章

初识反射之三(获取方法和成员变量)

当你还是一个对象时,你通过了修仙,getClass()方法得道成仙,然后开心的当上了神仙.然后发现神仙也有很多种,赤脚大仙,风神电母.那么你是不是好奇曾经仰望的神仙(类)会有什么技能(方法)和名字呢?这就是这篇我们应该讨论的.哈哈哈! 万物皆对象.类和方法也是对象. 然后通过方法.通过 getMethods() 获得了里面的方法.而方法里面还有 你能看到人家自己声明的方法以及全部方法. 再细分的话,方法不是有返回值吗?还有参数嘛.这些都可以用方法获得,不过是得到的就是数组了.getRurnTyp

final 关键字:用来修饰类,方法,成员变量,局部变量

final 关键字:用来修饰类,方法,成员变量,局部变量 表示最终的不可变的 1.final修饰一个类 表示当前的类不能有子类,也就是不能将一个类作为父类 格式: public final class 类名称 { class body } 一个类如果是final的,那么其中所有成员方法都不能被覆盖重写(因为没有子类),但是该类可以有父类 2.final关键字修饰成员方法 这个方法就是最终方法,也就是该类的子类不能覆盖重写这个方法 对于类.方法来说abstract.final不能同时使用,因为他们

Java反射理解(四)-- 获取成员变量构造函数信息

Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装了关于成员变量的操作: getFields() 方法获取的是所有的public的成员变量的信息 getDeclaredFields() 获取的是该类自己声明的成员变量的信息 getType() 得到成员变量的类型的类类型 getName() 得到成员变量的名称 获取成员变量构造函数信息: obj.g

根据类名,方法名,反射调用类的方法

/** * 根据类名,方法名,反射调用类的方法 * @方法名称: getResult * @描述: TODO * @param className * @param methodName * @param params * @return */ public static String getResult(String className,String methodName,Map<String,Object> params){ String result = null; try{ Objec

C#通过反射调用类及方法

反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创建对象实例 /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="assemblyN

OC语法2——OC的类,方法,成员变量的创建

类的创建: 与Java不同的是,OC创建一个类需要两个文件(.h和.m文件) 1> xxx.h:声明文件.用于声明成员变量和方法.关键字@interface和@end成对使用. 声明文件只是声明该类里成员变量和方法的格式(返回值类型,参数类型等),并不会实现它们. 在OC中继承用冒号表示,所有类都是继承于NSObject的,所以Sudent:NSObject.(这是和Java不同的,Java中所有类都继承于Object,但不用每定义一个类都写明继承关系,所有类都是默认继承于Object类的).

在类中添加方法和成员变量

在前面我们也了解到了Java语言的最小单位是类.在C语言中有着全局变量,在Java中也有. 在Java中添加全局变量(成员变量)是由三大部分组成的:访问修饰符.数据类型和成员变量. 而访问修饰符有这几种:public .private.protected或者不写(这种将使用默认访问修饰符). 我们在引用对象时,必须对其进行初始化,否则将会报错.如果我们不自己去初始化值,那马那么 电脑回自己默认初始值:0.0.0.null.false.空字符. 在Java类中添加方法也是由:访问修饰符.返回值.方

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

1.关于私有成员变量 无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected.public方法(如getter.setter方法)来访问. 2.关于静态成员变量 无论父类中的成员变量是静态的.还是非静态的,子类都会拥有父类中的这些成员变量. 3.关于被子类覆盖的成员变量 无论父类中的成员变量是否被子类覆盖,子类都会拥有父类中的这些成员变量. 原文地址:https://ww

在C#中使用反射调用internal的方法

MSDN上解释Internal如下: The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly. 即, 仅允许相同程序集内的代码调用类型或成员. 那么是否可以调用这些internal的方法呢? 如果被调用的程序集, 在代码中使用了InternalsVisi