清新又温暖。它是为某个面试问题而写的。有什么问题欢迎来喷。看看它们的区别Static/DynamicDifferenceStaticProxyclasses是由程序员创建的或者源代码由特定工具自动生成然后编译。代理类的.class文件在程序运行前就已经存在,是在程序运行时通过反射机制动态创建的。先把静态代理和动态代理的代码放上来看看名字。这是需要代理的接口。不管是静态的还是动态的,一个接口ToBeProxyedInterface.javapublicinterfaceToBeProxyedInterface{voidaddUser(StringuserId,StringuserName);voiddelUser(StringuserId);StringfindUser(StringuserId);voidmodifyUser(StringuserId,StringuserName);}下面是两个类,ToBeProxyedService1.java,ToBeProxyedService2.java,静态代理只需要一个,动态代理给Experiment用它的活力,所以两个具体的服务就来了。后面可以看到客户端main方法的实现。如何指定服务1或2调用ToBeProxyedService1}@OverridepublicvoiddelUser(StringuserId){System.out.println("ToBeProxyedService1.delUser");}@OverridepublicStringfindUser(StringuserId){System.out.println("ToBeProxyedService1.findUser");返回“张三”;}@OverridepublicvoidmodifyUser(StringuserId,StringuserName){System.out.println("ToBeProxyedService1.modifyUser");}}ToBeProxyedService2.class公共类ToBeProxyedService2实现ToBeProxyedInterface{@OverridepublicvoidaddUser(StringuserId,StringuserName){System.out.println("ToBeProxyedService2.addUser");}@OverridepublicvoiddelUser(StringuserId){System.out.println("ToBeProxyedService2.delUser");}@OverridepublicStringfindUser(StringuserId){System.out.println("ToBeProxyedService2.findUser");返回“张三2”;}@OverridepublicvoidmodifyUser(StringuserId,StringuserName){System.out.println("ToBeProxyedService2.modifyUser");}}关键类,静态代理,通过构造方法传入具体需要代理的Service,所以每个Handler只能代理一个Service,添加另一个Service时,需要对应一个Handler,即不太适合扩展StaticProxyHandler.javapublicclassStaticProxyHandlerimplementsToBeProxyedInterface{//目标对象privateToBeProxyedService1toBeProxyedService1;//通过构造方法传入目标对象publicStaticProxyHandler(ToBeProxyedService1toBeProxyedService1){this.toBeProxyedService1=toBeProxyedService1;}@OverridepublicvoidaddUser(StringuserId,StringuserName){try{//添加打印日志的功能//开始添加用户System.out.println("启动StaticProxyHandler-->addUser()");toBeProxyedService1.addUser(userId,userName);//添加用户成功System.out.println("successStaticProxyHandler-->addUser()");}catch(Exceptione){//添加用户失败System.out.println("errorStaticProxyHandler-->addUser()");}}@OverridepublicvoiddelUser(StringuserId){toBeProxyedService1.delUser(userId);}@OverridepublicStringfindUser(StringuserId){toBeProxyedService1.findUser(userId);返回“张三”;}@OverridepublicvoidmodifyUser(StringuserId,StringuserName){toBeProxyedService1.修改用户(用户ID,用户名);}}最重要的是,动态代理,里面看不到具体的服务,在client的main方法中指定传入哪个服务来指定不同的服务,其实动态代理是通过实现InvocationHandler来实现的.具体来说,newProxyInstance方法是传入入参指定的具体Service的动态绑定,Handler中实现的InvocationHandler中的invoke方法就是实际调用的具体方法。实现。DynamicProxyHandler.javapublicclassDynamicProxyHandlerimplementsInvocationHandler{//目标对象privateObjecttargetObject;//绑定关系,即当哪些方法与哪个接口(绑定到具体的实现类)相关联时会被调用,执行invoke方法。publicObjectnewProxyInstance(ObjecttargetObject){this.targetObject=targetObject;//该方法用于为指定的类加载器生成一个动态代理类实例,一组接口和一个调用处理程序//第一个参数指定生成代理对象Loader的类,需要指定为相同classloaderasthetargetobject//第二个参数必须实现与目标对象相同的接口,所以只需要获取目标对象的实现接口即可//第三个参数表示这些是哪个InvocationHandler的invoke方法需要的拦截方法被拦截时执行//根据传入的target返回一个代理对象returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);}@Override//关联实现类的方法调用时会执行/*InvocationHandler接口的方法,proxy表示代理,method表示调用原对象的方法,args表示的参数方法*/publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("startDynamicProxyHandler--invoke>>");for(inti=0;i
