一、基本反射技术
1.1 根据一个字符串得到一个类
getClass方法
打印结果如下:
Class.forName
比如我们获取java.lang.String的类名
这里也通过捕获异常,因为我们传的这个字符串可能不合法,字符串合法命名是类的命名空间和类的名称组成
打印结果如下:
我们还可以通过c1.getSuperclass()获取到他的父类
Type属性
基本类型都有type属性,可以得到这个基本类型的类型,比如:
二、获取类的成员
当类中方法定义为私有的时候我们能调用?不能!当变量是私有的时候我们能获取吗?不能!但是反射可以,比如源码中有你需要用到的方法,但是那个方法是私有的,这个时候你就可以通过反射去执行这个私有方法,并且获取私有变量。
获取类的构造函数
为了便于测试,我们定义一个Test类,Test类如下:(省略get和set方法)
Test类中我们定义是三个私有变量,生成两个公有的含参构造方法和一个私有的含参构造方法以及一个公有的无参构造方法。
下面我们通过反射获取这些构造方法
获取类的所有构造方法
通过getDeclaredConstructors可以返回类的所有构造方法,返回的是一个数组因为构造方法可能不止一个,通过getModifiers可以得到构造方法的类型,getParameterTypes可以得到构造方法的所有参数,返回的是一个Class数组,所以我们如果想获取所有构造方法以及每个构造方法的参数类型,可以有如下代码:
运行结果如下所示:
这样我们就得到了类中所有构造方法和构造方法中的参数,那么我们如何获取特定的构造方法呢?
获取类中特定的构造方法
我们可以通过getConstructors方法获取类中 所有的public类型的构造方法,代码和上面一样就不演示了。
我们可以通过getDeclaredConstructor()方法传参获取特定参数类型的构造方法,这里注意是getDeclaredConstructor()不是 getDeclaredConstructors() ,所以返回的是一个Class对象而不是一个Class数组。
获取无参构造方法直接不传参数,如下所示:
这里要进行异常捕获,因为可能不存在对应的构造方法,打印结果如下:
如果我们想获取有两个参数分别为int和String类型的构造方法,代码如下:
这里我们同样打印出构造方法的参数:
调用构造方法
从这里开始慢慢到了关键的一步,得到类的实例,我们主要借助于newInstance方法,为了方便演示我们将测试类的两个构造方法打印出来.
我们先来调用public的方法,如下所示:
运行打印结果如下:
那么调用私有构造方法呢,和上面一样,只是我们要设置constructors.setAccessible(true);代码如下:
打印结果如下:
调用类的私有方法
如何调用类中的私有方法呢,我们先在测试类中编写一个测试的私有方法 如下:
我们知道如果我们要正常的调用类的方法都是通过类.方法调用,所以我们调用私有方法也需要得到类的实例,而我们上面newInstace已经得到了类的实例,这样就好办了。
我们首先通过 getDeclaredMethod方法获取到这个私有方法,第一个参数是方法名,第二个参数是参数类型
然后通过invoke方法执行,invoke需要两个参数一个是类的实例,一个是方法参数。
test类的实例当不能new 获取的时候我们也可以通过反射获取,就是上面的newInstance方法。打印结果如下:
获取类的私有字段并修改值
看到这里你可能会说,有了set方法,什么私有不私有,test.set不就可以了,但是这里要注意我们是没有办法得到这个类的实例的,要不然都可以得到实例就没有反射一说了。我们在通过反射得到类的实例之后先获取字段:
以上是我们上面通过反射构造方法获取的实例, 打印field.get(o).toString()的值如下:
不过要注意的是我们修改了name的值只对当前的实例对象有效。
四川电科网安科技有限公司成立于2018年7月26日,立足于公共安全行业应用,是一家专业从事网络与信息安全技术研究,以网络攻防技术产品与反新型网络犯罪为核心的服务型公司;公司依托校企合作模式,充分转化高校科研攻坚技术能力,深化网络攻防技术研究,净化网络空间,用我们的智能信息技术让社会更美好,立志成为公共安全行业最佳智能信息解决方案服务商。
电科网安(UPSEC)秉承“诚信,创新,专注,合作”的发展宗旨,为客户提供专业化的服务。公司成立至今现已拥有发明专利、实用新型专利共32项,软件著作权45项。荣获成都市新经济大数据领军人才、成都市雏鹰梯度培育企业、高新技术企业等称号。截止目前,与公安部以及全国上百家公安单位建立合作关系。团队成员150+,其中90%均为核心技术研发,均来自国内著名高校,曾任职腾讯,阿里,360,奇安信等安全公司。
公司联合电子科技大学公共安全技术研究中心,建立空明安全实验室,御风安全实验室两大研究机构,致力于网络攻防前沿技术研究与探索,砥砺奋进,创新突破,力争成为全球一流的智能信息技术团队。
用我们的智能信息技术让社会更美好
公众号:电科网安
长按二维码关注
原文始发于微信公众号(电科网安):Java反射技术详解
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论