关于Java反射的一点代码
一、背景
最近又看了下java反射的一些东西,所以简单汇总记录一下.二、关于java反射2.1、什么是java反射
① 反射是一种动态获取信息及调用对象的一种机制。
② 对于一个在运行中的java类,我们都可以知道它的所有属性和方法。
③ 对于一个在运行状态中的对象,我们也都能通过反射来调用它的任意方法已经属性的调用及改变2.2、什么情况下会用到反射
① 一般来说我们在日常开发中直接用到反射的地方不多,它更多用于框架的开发
② 不能明确接口调用的是哪个函数,需要根据传入参数再运行时决定。
③ 不能明确传入函数的参数类型,但是又需要再运行时处理任意对象2.3、反射给我们提供了那些支持
① Class.forName(String className): 返回给定字符串名称的类或接口的相关类对象
② getDeclaredConstructors():返回一个数组,包含类的公共构造函数
③ getConstructor(Class<?>, paremeterTypes):返回指定反射类的指定入参类型的构造函数
④ getDeclaredMethos():返回一个数组,包含反射类的所有公共、保护、私有、默认方法(不包括继承的方法 )
⑤ getDeclaredFields():返回一个数组,包含反射类的所有字段属性
⑥ getDeclaredField(String fieldName): 返回反射类指定名称的字段属性
⑦ getMethods(): 返回一个数组,包含反射类的公共方法,包含继承的方法
⑧ getMethod(String name, Class<?>, paremeteraTypes): 返回反射类指定的公共成员方法
PS:更多信息,请参考官方文档。 三、代码示例 @Data public class Person { private String name; private int age; public Person(){ System.out.println("我是默认构造方法,我被调用了!"); } public Person(String name, int age){ System.out.println("有参构造 --- 姓名为:" + name + " 年龄为:" + age); } }
import com.example.easyexcel.model.Person; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; public class Test { public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, NoSuchFieldException { System.out.println("通过反射调用类的默认构造方法"); Class person = Class.forName("com.example.easyexcel.model.Person"); Constructor constructor = person.getConstructor(null); constructor.newInstance(null); System.out.println("通过反射调用类的有参构造方法"); Constructor constructor1 = person.getConstructor(String.class, int.class); constructor1.newInstance("XiaoMing", 19); System.out.println("======================================"); Person bean = new Person(); bean.setName("ZZSS"); Field[] fields = bean.getClass().getDeclaredFields(); Field field = bean.getClass().getDeclaredField("name"); field.setAccessible(true); Object objectName = field.get(bean); System.out.println("获取指定字段name的值为:" + objectName); System.out.println("======================================"); for(int i = 0;i < fields.length;i++){ Field fieldTmp = fields[i]; // 设置属性是可以访问的 fieldTmp.setAccessible(true); // 得到此属性的值 Object valTmp = fieldTmp.get(bean); String type = fieldTmp.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"); } else if(type.endsWith("int") || type.endsWith("Integer")) { // 给属性设值 fieldTmp.set(bean,121); } } System.out.println("重新设值后的对象属性为:"+bean.getName()+" "+bean.getAge()); } }
Java
程序输出如下:
通过反射调用类的默认构造方法
我是默认构造方法,我被调用了!
通过反射调用类的有参构造方法
有参构造 --- 姓名为:XiaoMing 年龄为:19
======================================
我是默认构造方法,我被调用了!
获取指定字段name的值为:ZZSS
======================================
字段类型为:class java.lang.String
属性名:name
属性值:ZZSS
======================================
字段类型为:int
属性名:age
属性值:0
======================================
重新设值后的对象属性为:LFG 121
四、日志模块中部分代码示例 private void saveSysLog(ProceedingJoinPoint joinPoint, long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLogEntity sysLog = new SysLogEntity(); SysLog syslog = method.getAnnotation(SysLog.class); if (syslog != null) { // 注解上的描述 sysLog.setOperation(syslog.value()); } // 请求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); sysLog.setMethod(className + "." + methodName + "()"); // 请求的参数 Object[] args = joinPoint.getArgs(); try { String params = new Gson().toJson(args[0]); sysLog.setParams(params); … } catch (Exception e) { } // 获取request HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); // 设置IP地址 sysLog.setIp(IPUtils.getIpAddr(request)); … sysLogApi.saveLog(sysLog); }
Java
PS: 可以参见:Springboot自定义注解日志管理实现
新年新机,性能之王!00X00序言随着数码科技的迅猛发展,数码用户越来越习惯使用轻便易用的移动互联网设备来上网和娱乐,平板产业同样经历着巨大变更,2017年又是新概念平板与PC合二为一高性能低能耗生活
中秋邀君共赏新机Tbook16S畅玩剑侠情缘。明月几时有,抬头自己瞅!平板数码产品一波还未平息,一波又侵袭,2016年又引来一次产品理念变革,PC平板二合一的潮流设计,揭开国内平板市场新序幕,自年初台电在召开Tbook发布会至
华为石墨烯电池已经商用为什么遭到中科院清华院的质疑?在2016年12月的第一天,华为在中央研究院瓦特实验室在日本大会上宣布锂电池领域有重大突破,推出世界首个高温寿命石墨烯基锂离子电池。报告中明确指出,主要针对温度做出了明确的解释,在
360巴迪龙儿童手表发布后短短1个月,超越同行勇夺销量第一。360巴迪龙儿童手表发布后短短1个月,超越同行勇夺销量第一,凭的是什么?导读近年些来,社交软件的迅速发展和网络应用的普及,儿童走失被拐的事件得到了越来越多的报道,类似的新闻更是已经
酷比魔方iwork1X刷机Remix2。0系统分享PConline资讯新机油不知道如何刷机,或者刷机遇到问题,主要是没认真参考刷机教程,这里我把经常会遇到的问题,归纳下另外刷机会把平板数据清空,若有重要资料提前做好备份。本次提供I
电芯强劲,高效转化,物色移动电源匠心之作随着移动电源越来越走进生活,越来越普及,如何选择一款适合自己的数码产品,它的必需性能强电能大,同时外形时尚美观,又可以携带方便的移动电源,那么请大家关注这款酷比魔方的新品M2000
2016一款大家都会喜欢的超级平板序酷比魔方作为国内知名平板厂家,一直致力于为用户打造更加优秀的使用体验,在业界同类产品中,不但性价比突出,同时工艺卓越独具匠心,这款美的搭载Skylake芯64GB内存,将给您带来
炫酷极品!青春活力自我的台电T9系列移动电源评测T9移动电源(三种款式)凭外观欣赏,都非常青春时尚,充满活力激情,自我奔放德国设计师设计,产品电芯强劲,聚合物锂电池安全稳定外形超薄,携带方便双USB,2。1A输入可广泛应用于手机
Thinker笔记本低调入市,掀起性价风波,各位老板怎么看不光是联想也不是小米,thinker笔记本低调入市,却掀起新一轮性价风波,各位老板怎么看?3月30日,国内著名平板电脑厂商酷比魔方联合微软和英特尔在京召开发布会,期间酷比魔方发布了
USB3。1移动硬盘盒速度真快!大家好!我是蛮牛士,本次向大家分享一款由深圳市元创时代科技有限公司原创设计的ORICOTypeC高速移动硬盘盒子,说起ORICO应该家喻户晓了,短短几年内已经成为国内著名的数码周边
安卓桌面级应用,REMIXMINI小盒子RemixMini。jpg(1。19MB,下载次数0)下载附件201511291349上传小伙伴们烧机友们大家好!本次向大家分享技德科技2015年度主打产品之一RemixMini,