一、背景 最近又看了下java反射的一些东西,所以简单汇总记录一下。二、关于java反射2。1、什么是java反射 反射是一种动态获取信息及调用对象的一种机制。 对于一个在运行中的java类,我们都可以知道它的所有属性和方法。 对于一个在运行状态中的对象,我们也都能通过反射来调用它的任意方法已经属性的调用及改变2。2、什么情况下会用到反射 一般来说我们在日常开发中直接用到反射的地方不多,它更多用于框架的开发 不能明确接口调用的是哪个函数,需要根据传入参数再运行时决定。 不能明确传入函数的参数类型,但是又需要再运行时处理任意对象2。3、反射给我们提供了那些支持 Class。forName(StringclassName):返回给定字符串名称的类或接口的相关类对象 getDeclaredConstructors():返回一个数组,包含类的公共构造函数 getConstructor(Classlt;?,paremeterTypes):返回指定反射类的指定入参类型的构造函数 getDeclaredMethos():返回一个数组,包含反射类的所有公共、保护、私有、默认方法(不包括继承的方法) getDeclaredFields():返回一个数组,包含反射类的所有字段属性 getDeclaredField(StringfieldName):返回反射类指定名称的字段属性 getMethods():返回一个数组,包含反射类的公共方法,包含继承的方法 getMethod(Stringname,Classlt;?,paremeteraTypes):返回反射类指定的公共成员方法 PS:更多信息,请参考官方文档。三、代码示例DatapublicclassPerson{privateStringname;privateintage;publicPerson(){System。out。println(我是默认构造方法,我被调用了!);}publicPerson(Stringname,intage){System。out。println(有参构造姓名为:name年龄为:age);}} importcom。example。easyexcel。model。Person;importjava。lang。reflect。Constructor;importjava。lang。reflect。Field;importjava。lang。reflect。InvocationTargetException;publicclassTest{publicstaticvoidmain(Stringargs〔〕)throwsIllegalArgumentException,IllegalAccessException,ClassNotFoundException,NoSuchMethodException,InvocationTargetException,InstantiationException,NoSuchFieldException{System。out。println(通过反射调用类的默认构造方法);ClasspersonClass。forName(com。example。easyexcel。model。Person);Constructorconstructorperson。getConstructor(null);constructor。newInstance(null);System。out。println(通过反射调用类的有参构造方法);Constructorconstructor1person。getConstructor(String。class,int。class);constructor1。newInstance(XiaoMing,19);System。out。println();PersonbeannewPerson();bean。setName(ZZSS);Field〔〕fieldsbean。getClass()。getDeclaredFields();Fieldfieldbean。getClass()。getDeclaredField(name);field。setAccessible(true);ObjectobjectNamefield。get(bean);System。out。println(获取指定字段name的值为:objectName);System。out。println();for(inti0;ifields。length;i){FieldfieldTmpfields〔i〕;设置属性是可以访问的fieldTmp。setAccessible(true);得到此属性的值ObjectvalTmpfieldTmp。get(bean);StringtypefieldTmp。getType()。toString();System。out。println(字段类型为:type);System。out。println(属性名:fieldTmp。getName());System。out。println(属性值:valTmp);System。out。println();得到此属性的类型if(type。endsWith(String)){给属性设值fieldTmp。set(bean,LFG);}elseif(type。endsWith(int)type。endsWith(Integer)){给属性设值fieldTmp。set(bean,121);}}System。out。println(重新设值后的对象属性为:bean。getName()bean。getAge());}} Java 程序输出如下: 通过反射调用类的默认构造方法 我是默认构造方法,我被调用了! 通过反射调用类的有参构造方法 有参构造姓名为:XiaoMing年龄为:19 我是默认构造方法,我被调用了! 获取指定字段name的值为:ZZSS 字段类型为:classjava。lang。String 属性名:name 属性值:ZZSS 字段类型为:int 属性名:age 属性值:0 重新设值后的对象属性为:LFG121 四、日志模块中部分代码示例privatevoidsaveSysLog(ProceedingJoinPointjoinPoint,longtime){MethodSignaturesignature(MethodSignature)joinPoint。getSignature();Methodmethodsignature。getMethod();SysLogEntitysysLognewSysLogEntity();SysLogsyslogmethod。getAnnotation(SysLog。class);if(syslog!null){注解上的描述sysLog。setOperation(syslog。value());}请求的方法名StringclassNamejoinPoint。getTarget()。getClass()。getName();StringmethodNamesignature。getName();sysLog。setMethod(className。methodName());请求的参数Object〔〕argsjoinPoint。getArgs();try{StringparamsnewGson()。toJson(args〔0〕);sysLog。setParams(params);}catch(Exceptione){}获取requestHttpServletRequestrequestHttpContextUtils。getHttpServletRequest();设置IP地址sysLog。setIp(IPUtils。getIpAddr(request));sysLogApi。saveLog(sysLog);} Java PS:可以参见:Springboot自定义注解日志管理实现