这个反射其实算是一道初级升中级的面试题,也是初级必须了解,中级必须了解并熟练使用的知识技能。 接下来就开始聊聊吧。什么是反射? 反射就是在程序运行状态中,对于任何一个类,都能通过特定的方式方法获取到这个类的属性和方法,并且可以对这些属性、方法进行调用。 说白了,反射就是在程序运行时获取和执行某个类属性或方法的功能。反射具体能做些什么? 能做的事情主要分为以下几种。 我们默认先写好一个类:APP。java;publicclassAPP{privateIntegerid;privateStringusername;publicStringpassword;publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this。idid;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this。usernameusername;}publicStringtoString(){System。out。print(toString);}privateStringtoString2(){System。out。print(toString2);}}获取类 Class。forName(param)方法 param:指定类的全路径,比如:com。test。APP,代码如下:publicstaticvoidmain(String〔〕args)throwsClassNotFoundException,InstantiationException,IllegalAccessException{ClassaClassClass。forName(com。test。APP);APPapp(APP)aClass。newInstance();} 这里的newInstance():实例化Class,生成对象,等同于new。调用公共属性(public) getField(param):获取指定的公共属性,param:指定的属性名称。 getFields():获取全部的公共属性,返回值Field〔〕数组。 代码如下:publicstaticvoidmain(String〔〕args){try{ClassaClassClass。forName(com。test。APP);APPapp(APP)aClass。newInstance();FieldpasswordaClass。getField(password);打印结果:publicjava。lang。Stringcom。test。APP。passwordSystem。out。println(password);Field〔〕fieldsaClass。getFields();}catch(Exceptione){e。printStackTrace();}}调用私有属性 getDeclaredField(param):获取指定的私有属性,param:指定的属性名称。 getDeclaredFields():获取全部的私有属性。 代码如下:publicstaticvoidmain(String〔〕args){try{ClassaClassClass。forName(com。test。APP);FieldusernameaClass。getDeclaredField(username);强制获得私有变量的访问权限username。setAccessible(true);打印结果:publicjava。lang。Stringcom。test。APP。usernameSystem。out。println(username);Field〔〕fieldsaClass。getDeclaredFields();}catch(Exceptione){e。printStackTrace();}} 这里还涉及到一个方法,就是setAccessible(true),其作用是获得访问权限,否则无法获取这个属性。调用公共方法(public) getMethod(param):获取指定的公共方法,param:指定的方法名称 getMethods():获取全部公共方法publicstaticvoidmain(String〔〕args){try{ClassaClassClass。forName(com。test。APP);MethodmethodaClass。getMethod(toString);Method〔〕methodsaClass。getMethods();执行toString()方法ObjectappaClass。newInstance();method。invoke(app);}catch(Exceptione){e。printStackTrace();}} 这里还有一个知识点,就是如何执行获取到Method方法,在代码中也有体现,可以自行尝试一下。调用私有方法 getDeclaredMethod(param):获取指定的私有方法,param:指定的私有方法名称。 getDeclaredMethods():获取全部的私有方法。publicstaticvoidmain(String〔〕args){try{ClassaClassClass。forName(com。test。APP);MethodmethodaClass。getDeclaredMethod(toString2);method。setAccessible(true);Method〔〕methodsaClass。getDeclaredMethods();执行toString()方法ObjectappaClass。newInstance();method。invoke(app);}catch(Exceptione){e。printStackTrace();}}