Java反射机制实例分析


这篇“Java反射机制实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java反射机制实例分析”文章吧。
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。我不太擅长文字表达,还是上图操作把不用反射机制的例子这时候添加动物,只需要添加类修改zoo修改main函数的动物类把上面修改为反射机制这时候添加动物只需要添加类修改main函数的动物类省了一步,传入类名可控,发现好像是存在的类都可以调我们用的最多的可能是forName(调用类)getMethod(调用类下方法)invoke(执行)newInstance(实例化对象)下面我们用反射机制来弹出计算机(calc)或者记事本(notepad)由于弹出计算机有点多这次我就弹记事本把,总而言之,能弹出来就很美妙
我们看下getRuntime函数

得知,该函数是Runtime类获取对象的方式,个人感觉是每用一次就调一次比较麻烦,为了不调用一次建立一个对象所以封装成了函数类对象获取方式Class.forName(类名获取)zoo.class(已经加载过的类)obj.class(实例)
类初始化修改zoo类,增加初始块、静态初始块、和构造函数类初始化执行顺序:静态初始块

类实例化执行顺序:静态初始块 – > 初始块 – > 构造函数

由此得知,类初始化和类实例化不一样接下来增加zoo1类继承zoo类子类初始化顺序:父类静态初始化块 – > 子类静态初始化块

子类实例化顺序:父类静态初始化块 – > 子类静态初始化块 – > 父类初始化块 – > 父类构造函数 – > 子类初始化块 – >子类构造函数

以上可以得知,当使用Class.forName时,且类静态初始化块可控,可以执行任意代码调用内部类Class.forName(“java.lang.Runtime”)来获取类(java.lang.Runtime是Runtime类的完整路径)getMethodgetMethod 的作用是通过反射获取类的某个特定的公有方法。
java支持类重载,但不能仅通过一个函数名确定一个函数,所以在调用getMethod时,需要传给它方法的参数类型列表
Class.forName(“java.lang.Runtime”).getMethod(“exec”, String.class)invoke静态和动态方法的区别
invoke方法在getMethod类下,作用时传递参数,执行方法
public Object invoke(Object obj, Object… args)
第一个参数是getMethod获取的方法的类对象(如果方法是静态方法则传类)
获取exec函数的类对象
Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”))
由于getRuntime是静态方法,所以传类
invoke(Class.forName(“java.lang.Runtime”).getMethod(“getRuntime”).invoke(Class.forName(“java.lang.Runtime”)),“calc.exe”)最后我们合并一下getConsturctor(函数可以选定指定接口格式的构造函数(由于构造函数也可以根据参数来进行重载)
选定后我们可以通过newInstance(),并传入构造函数的参数执行构造函数ProcessBuilder类有两免费云主机域名个构造函数public ProcessBuilder(String… command)(String…变长的字符串数组String[].class)public ProcessBuilder(List command)分别使用构造方法Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[][]{{“notepad”}})Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))执行完构造方法实例后,在进行强制转化使用start函数即可( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();实际中,肯定用不了,哪有这么好的事,还是接着反射把Class.forName(“java.lang.ProcessBuilder”).getMethod(“start”).invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList(“notepad”)));

这里可能有人会好奇我写的里那的另一个构造函数,String…command这个传参为什么用new String[][]{{“notepad”}},不应该是new String[]{“notepad”},现在用应该的((ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(String[].class).newInstance(new String[]{“notepad”})).start();在这行打断点调试

我们传的是一个字符串数组到了实例化的时候变成了一个字符串,再看看另一个构造函数(List)( (ProcessBuilder) Class.forName(“java.lang.ProcessBuilder”).getConstructor(List.class).newInstance(Arrays.asList(“notepad”))).start();依旧还是这行打断点
由此可知,List传入时会被当作Object的第一项,而String[]会被当做Object,所以多加一层[]{}通过函数getDeclaredConstructor获取私有方法,再利用setAccessible(true)打破私有方法限制以上就是关于“Java反射机制实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: 微信小程序积分商城有什么盈利玩法

这篇文章将为大家详细讲解有关微信小程序积分商城有什么盈利玩法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 登录商城即获积分 可以在用户授权之后登录到积分商城之后就能够获得相应的积分,来增加积分商城的活跃性,毕竟只有让用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 09/29 16:28
下一篇 09/29 16:28

相关推荐