设为首页 加入收藏

TOP

Java程序语言的后门-反射机制(三)
2018-10-10 04:11:13 】 浏览:690
Tags:Java 程序 语言 后门 反射 机制
字:富贵;颜色:黑色
修改狗狗的颜色:名字:富贵;颜色:红色
  修改成功,接着修改狗狗的名字:


// 修改狗狗的颜色
// 获取狗狗的color属性
Field filed = clazz.getField("color");
filed.set(haShiQi, "红色");
System.out.println("修改狗狗的颜色:"+haShiQi.toString());
// 修改狗狗的名字
filed = clazz.getDeclaredField("name");
// 强制设置为可以访问
filed.setAccessible(true);
filed.set(haShiQi, "惊喜");
System.out.println("修改狗狗的名字:"+haShiQi.toString());


  打印结果:


没有做任何修改前:名字:富贵;颜色:黑色
修改狗狗的颜色:名字:富贵;颜色:红色
修改狗狗的名字:名字:惊喜;颜色:红色
  修改成功,但是千万要注意是的是的getDeclaredField方法,而不是getField方法,使用getField方法会抛出异常:Exception in thread "main" java.lang.NoSuchFieldException: name;


  同时filed.setAccessible(true);也是必不可少了,否则将抛出异常:Exception in thread "main" java.lang.IllegalAccessException: Class com.zcz.reflecttest.LookLook can not access a member of class com.zcz.reflecttest.HaShiQi with modifiers "private"


  属性修改完,我们就开始调用方法吧。


九,调用方法


  打印结果:


惊喜 去跑着玩儿
  调用成功;


    代码:method.invoke(haShiQi, null);


  是不是觉得这句代码也是很熟悉的?在文章JAVA设计模式-动态代理(Proxy)示例及说明中也有相同的用法:


// 通过反射机制,通知力宏做事情
method.invoke(object, args);
  我们继续,eat方法和run方法一样,都是公有的方法,这里就不再演示了,接下来演示一下私有的dance方法:


  打印结果:


惊喜 去跑着玩儿
惊喜 来跳一支舞
  也同样成功了,但是也要注意getDeclaredMethod方法和method.setAccessible(true);


  到这里,同事不让我看的狗狗,我通过java的反射机制从里到外的全部都看了一遍,不仅仅是看了一遍,我还给他的狗狗改了颜色和名字。调用了所有的方法。是不是很神奇,很有成就感?


十,总结


  反射的基本用法已经都在上面的实例中演示到了,但是反射还是有其他的方法在这里并没有提到,有机会的话继续补充。


  在上面的代码过程中,你也许也发现了,不仅仅是有类对象,而且还有属性,方法和构造器都是对象,属性是java.lang.reflect.Field类的对象,方法是java.lang.reflect.Method类的对象,构造器是java.lang.reflect.Constructor类的对象。看来在java中确实是一切皆对象。


首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JVM自定义类加载器加载指定classP.. 下一篇Java SpringBoot集成RabbitMQ实战..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目