开源框架安全审计全流程:从架构梳理到漏洞验证的实战指南
2026/6/30 19:43:50
英文定义(《设计模式:可复用面向对象软件的基础》)
Provide a surrogate or placeholder for another object to control access to it.
中文翻译
为其他对象提供一种代理以控制对这个对象的访问。
理解
角色说明:
suject接口和实现
publicinterfaceISubject{/** * @description 行为方法 * @author bigHao * @date 2026/1/17 **/voiddoAction();/** * @description 行为方法2 * @author bigHao * @date 2026/1/17 **/voiddoAction2();}publicclassRealSubjectimplementsISubject{@OverridepublicvoiddoAction(){System.out.println("do action");}@OverridepublicvoiddoAction2(){System.out.println("do acton2");}}静态代理
publicclassSubjectProxyimplementsISubject{privateISubjectsubject;publicSubjectProxy(){subject=newRealSubject();}@OverridepublicvoiddoAction(){// 代理行为System.out.println("proxy acton start");subject.doAction();// 代理行为System.out.println("proxy acton end");}@OverridepublicvoiddoAction2(){// 代理行为System.out.println("proxy acton start");subject.doAction2();// 代理行为System.out.println("proxy acton end");}}测试:
publicclassClient{staticvoidmain(){ISubjectproxy=newSubjectProxy();System.out.println("=== proxy acton1 ===");proxy.doAction();System.out.println("=== proxy acton2 ===");proxy.doAction2();}}输出:
=== proxy acton1 === proxy acton start do action proxy acton end === proxy acton2 === proxy acton start do acton2 proxy acton endjava.lang.reflect提供了核心API,方法和参数说明:
/** * Proxy类提供用于创建动态代理类和实例的静态方法。 * 它是所有由Proxy创建的动态代理类的父类。 */publicclassProxyimplementsjava.io.Serializable{/** * * @param loade 定义代理类的类加载器。通常使用目标接口的类加载器, * 或者使用当前线程的上下文类加载器(Thread.currentThread().getContextClassLoader()) * * @param interfaces 代理类要实现的接口列表 * * @param h 调用处理器,当代理实例的方法被调用时,调用处理器的invoke方法会被调用 * */publicstaticObjectnewProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)}/** * InvocationHandler是由代理实例的调用处理器实现的接口。 */publicinterfaceInvocationHandler{/** * 处理代理实例上的方法调用并返回结果。 * 当在与之关联的代理实例上调用方法时,将在调用处理器上调用此方法。 * * @param proxy 调用该方法的代理实例。 * 这是代理对象本身,不是真实的目标对象。 * * @param method 对应于在代理实例上调用的接口方法的Method实例。 * Method对象的声明类将是在该方法声明的接口, * 该接口可能是代理类继承该方法的代理接口的超接口。 * * @param args 包含在代理实例的方法调用中传递的参数值的对象数组。 * */publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable;}、suject接口和实现
publicinterfaceISubject{/** * @description 行为方法 * @author bigHao * @date 2026/1/17 **/voiddoAction();/** * @description 行为方法2 * @author bigHao * @date 2026/1/17 **/voiddoAction2();}publicclassRealSubjectimplementsISubject{@OverridepublicvoiddoAction(){System.out.println("do action");}@OverridepublicvoiddoAction2(){System.out.println("do acton2");}}动态代理
publicclassProxyFactory{privateObjecttarget;publicProxyFactory(Objecttarget){this.target=target;}publicObjectgetProxyInstance(){returnProxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newInvocationHandler(){@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("proxyName: "+proxy.getClass().getName());System.out.println("methodName: "+method.getName());// 代理行为System.out.println("jdk proxy acton start");// 反射调用目标对象方法Objectinvoke=method.invoke(target,args);// 代理行为System.out.println("jdk proxy acton end");returninvoke;}});}}测试:
publicclassClient{staticvoidmain(){ISubjectproxyInstance=(ISubject)newProxyFactory(newRealSubject()).getProxyInstance();System.out.println("=== jdk proxy acton1 ===");proxyInstance.doAction();System.out.println("=== jdk proxy acton2 ===");proxyInstance.doAction2();}}输出;
===jdk proxy acton1===proxyName:jdk.proxy1.$Proxy0methodName:doAction jdk proxy acton startdoaction jdk proxy acton end===jdk proxy acton2===proxyName:jdk.proxy1.$Proxy0methodName:doAction2 jdk proxy acton startdoacton2 jdk proxy acton endCglib(Code Generation Library)是个功能强大、高性能、开源的代码生成包,被广泛使用,比如spring等
它可以为没有实现接口的类提供代理
这里示例是用的spring集成的org.springframework.cglib.proxy。
核心API是包下面的Enhancer、MethodInterceptor,感兴趣可以跟一下源码
需要代理的类(不需要实现接口)
publicclassRealSubject{publicvoiddoAction(){System.out.println("do action");}publicvoiddoAction2(){System.out.println("do acton2");}}代理类
publicclassProxyFactoryimplementsMethodInterceptor{privateObjecttarget;publicProxyFactory(Objecttarget){this.target=target;}publicObjectgetProxyInstance(){// 1.使用apiEnhancerenhancer=newEnhancer();// 2.设置父类enhancer.setSuperclass(target.getClass());// 3.设置回调函数enhancer.setCallback(this);// 4.创建代理对象returnenhancer.create();}@OverridepublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{System.out.println("proxyName: "+proxy.getClass().getName());System.out.println("methodName: "+method.getName());// 代理行为System.out.println("cglib proxy acton start");// 反射调用目标对象方法Objectinvoke=method.invoke(target,args);// 代理行为System.out.println("cglib proxy acton end");returninvoke;}}测试
publicclassClient{publicstaticvoidmain(String[]args){RealSubjectsubject=(RealSubject)newProxyFactory(newRealSubject()).getProxyInstance();System.out.println("=== cglib acton1 ===");subject.doAction();System.out.println("=== cglib acton2 ===");subject.doAction2();}}输出
=== cglib acton1 === proxyName: org.springframework.cglib.proxy.MethodProxy methodName: doAction cglib proxy acton start do action cglib proxy acton end === cglib acton2 === proxyName: org.springframework.cglib.proxy.MethodProxy methodName: doAction2 cglib proxy acton start do acton2 cglib proxy acton end高内聚低耦合:
增加系统复杂度:
参考: