Java反射高级应用--注入代码
2012-04-12 15:47
483 查看
有时候我们需要改变一些系统平台里某些组件的执行流程,但限于系统平台的原因,不能通过修改源代码来直接实现,这时候反射这一大法宝就有了用武之地。下面的Demo就是一个简单的例子,通过平台对外曝露的接口,实现另类的包装,并注入我们自己的代码~
模拟系统平台的类:
上面的组件中用到的系统平台曝露的接口:
我们自己的Task接口的实现,其接收一个已有的Task,并对其进行了包装:
下面就是重头戏了,看看我们的注入过程:
执行结果:
哈哈哈~~成功运行了我们自己的代码,又没有破坏系统原有的流程~
当然我们再注入的过程中,还可以进行更多的操作,大家就自己发挥吧~
模拟系统平台的类:
package reflectInject; public class SysComponent { private final Task sysTasker ; public SysComponent(){ sysTasker = new Task() { @Override public void work() { System.out.println("Systasker is running...."); } }; } public void doWork(){ sysTasker.work(); } }
上面的组件中用到的系统平台曝露的接口:
package reflectInject; public interface Task { void work(); }
我们自己的Task接口的实现,其接收一个已有的Task,并对其进行了包装:
package reflectInject; public class MyTasker implements Task { private Task innerTasker; public MyTasker(Task innerTasker) { super(); this.innerTasker = innerTasker; } @Override public void work() { System.out.println("MyTasker is running..."); if(innerTasker!=null){ innerTasker.work(); } } }
下面就是重头戏了,看看我们的注入过程:
package reflectInject; import reflectInject.ReflectionUtils.ReflectionException; public class InjectSysComponent { public static void main(String[] args) throws ReflectionException { //模拟一个系统组件,我们是不能直接修改源码的,比如一些平台上的东东 SysComponent sys = new SysComponent(); //模拟系统内部调用方法,观察输出结果 sys.doWork(); //获得系统组件自身持有的对象 Task sysTasker = (Task) ReflectionUtils.getFiled(SysComponent.class, sys,"sysTasker"); //创建自己的对象,并将刚才得到的对象进行包装 MyTasker myTaser = new MyTasker(sysTasker); //给系统设置上我们自定义的对象 ReflectionUtils.setFieldValue(SysComponent.class, sys, "sysTasker", myTaser); //再次模拟系统内部调用方法,观察输出结果 System.out.println("SysComponent injected...."); sys.doWork(); } }
执行结果:
Systasker is running.... SysComponent injected.... MyTasker is running... Systasker is running....
哈哈哈~~成功运行了我们自己的代码,又没有破坏系统原有的流程~
当然我们再注入的过程中,还可以进行更多的操作,大家就自己发挥吧~
相关文章推荐
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Java反射的高级应用,模拟开发环境IDE动态搜索类成员以及方法,。。。。。
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Java反射的高级应用,模拟开发环境IDE动态搜索类成员以及方法,。。。。。
- Java应用:编写高级JavaScript应用代码
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- JAVA高级应用第四周代码总结
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存 .
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- 【Java高级】反射+工厂模式+属性文件的实例应用
- JAVA高级应用第六周代码总结
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- C#高级应用-反射动态调用类的成员范例代码
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- Java反射的高级应用,模拟开发环境IDE动态搜索类成员以及方法,。。。。。
- Java反射高级应用--利用反射调用类…