目录
在Java代码审计中静态代理是必须要掌握的,
什么是Java静态代理?
代理这个词是来源于Java设计模式中的代理模式,代理模式最简单的理解就是通过第三方来代理我们的工作
场景模拟:
在一个项目中连接数据库操作是不可避免的,不可能每个开发人员在连接数据库时都要重新写一边连接代码,此时需要一个接口(Mappr1)。连接,关闭数据库功能的代码封装放到实现了接口的代理类里面(StaticProxy),
每个需要用到连接,关闭数据库功能的对象(Usermappr, Adminmappr)只需要实现这个接口即可。当某个对象(Usermappr, Adminmappr)实现了接口,不需要在反复写连接数据库部分,只需要在重写接口方法时写具体业务操作代码即可,然后把某个对象(Usermappr,Adminmappr)传递给代理类(StaticProxy) 即可,这样就实现传入什么对象执行相应的操作.
代码PART
首先是父接口Mappr1.class
package statics;public interface Mappr1 {public void jdbc0();}目标对象 AdminMappr.class
package statics;public class AdminMappr implements Mappr1{ public void jdbc0(){System.out.println("--secbang--admin--执行核心业务代码----"); }}目标对象 UserMappr.class
package statics;public class UserMappr implements Mappr1 {public void jdbc0(){ System.out.println("--user--执行核心业务代码----");}}代理类 StaticProxy.class
public class StaticProxy implements Mappr1{ private Mappr1 um; //创建接口对象/* * 有参构造器 */ public StaticProxy(Mappr1 um) {this.um = um; }public void jdbc0(){ System.out.println("---获取链接----"); um.jdbc0(); System.out.println("---关闭链接----"); }}然后我们进行测试
package statics;public class Test {public static void main(String[] args) {// 创建目标对象UserMappr mp =new UserMappr();AdminMappr ap =new AdminMappr();//创建代理StaticProxy sp =new StaticProxy(ap);sp.jdbc0();}}输出结果
总结
1.实现了Mappr1接口的类都可以看作为Mappr1对象
2.核心在StaticProxy代理类,传入什么对象执行相应的操作。
执行过程
1.Main方法执行
2.UserMappr mp =new UserMappr(); (创建Usermappr对象)///
3.创建StaticProxy(传递实现了接口的Usermaoor对象mp 这个对象可以是任何实现了Mappr1接口的类对象)
4.这样利用 StaticProxy即可实现更为灵活的调用不同类的对象。
有人可能会有疑惑,这样做有点多此一举,为啥还要去代理呢, 这就涉及到工作需求,在不改变实现类的情况下,对实现类进行功能的增加,由此而产生了代理类,生成代理对象
静态就是在创建代理类的时候,接口和被代理类都已经被固定了,无法改变,代理类就只能这一种类,我们主要的是实现代理功能,实际上已经完成了这个功能,
实际开发中有很多功能增强时,就需要更多的代理类,即每一个主题接口都得创建一个代理类,会造成代码的繁多和冗余,因此就产生了我们的动态代理技术.