Java动态代理和静态代理区别

news/2024/12/2 15:48:20/

静态代理

package staticproxy;/*** 接口* @author newtouch**/
public interface IHello {public void sayHello();public String doSomethong(String s);}

  

package staticproxy;/*** 实现类* @author newtouch**/
public class Hello implements IHello{@Overridepublic void sayHello() {System.out.println("zhangxiongfeng");}@Overridepublic String doSomethong(String s) {return s;}}

  

package staticproxy;/*** 静态代理类* @author newtouch**/
/*** * @author newtouch* * 问题 如果接口中有多个方法 静态代理中 就会有多重新代理的方法**/
public class StaticProxy {private IHello iHello;public StaticProxy(IHello iHello) {this.iHello=iHello;}public void sayHello() {iHello.sayHello();}public String doSomethong(String s) {return iHello.doSomethong(s);}}

  

package staticproxy;public class Test {public static void main(String[] args) {IHello iHello = new Hello();StaticProxy staticProxy = new StaticProxy(iHello);staticProxy.sayHello();System.out.println(staticProxy.doSomethong("zhangxiongfeng"));}}  

动态代理:

package proxy;/*** 接口* @author newtouch**/
public interface IHello {public void sayHello();public String doSomethong(String s);}

  

package proxy;public class Hello implements IHello{@Overridepublic void sayHello() {System.out.println("zhangxiongfeng");}@Overridepublic String doSomethong(String s) {return s;}}

  

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler {private IHello iHello;DynamicProxy(IHello iHello) {this.iHello = iHello;}/*** 调用接口 IHello接口中的  任何方法都是要用下面的方法执行* *  可以不用像静态代理中 每个方法都必须重写 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//  在代理真实对象前我们可以添加一些自己的操作System.out.println("before rent house");System.out.println("Method:" + method);//    当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用method.invoke(iHello, args);//  在代理真实对象后我们也可以添加一些自己的操作System.out.println("after rent house");return null;}
}

  

package proxy;import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubIHello iHello = new Hello();DynamicProxy dynamicProxy = new DynamicProxy(iHello);IHello hello = (IHello) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), iHello.getClass().getInterfaces(), dynamicProxy);// hello.sayHello();System.out.println(hello.doSomethong("zhangxf"));}}

  动态代理执行:

before rent house
Method:public abstract void proxy.IHello.sayHello()
zhangxiongfeng
after rent house

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;public class ProxyFactory<T> {private T t;private InvocationHandler invocationHandler;public ProxyFactory(T t,InvocationHandler invocationHandler) {this.t = t;this.invocationHandler = invocationHandler;}public T newProxyInstance() {return (T)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(), t.getClass().getInterfaces(), invocationHandler);}
}动态工厂

  

 

转载于:https://www.cnblogs.com/zxf330301/p/9258512.html


http://www.ppmy.cn/news/614435.html

相关文章

L4自动驾驶技术

L4自动驾驶技术 一&#xff0e;SAE的五个级别分别是&#xff1a; L0&#xff1a;驾驶员完全掌控车辆&#xff0c;无任何自动化能力。 L1&#xff1a;自动系统有时能够辅助驾驶员完成某些驾驶任务。比如高速自动巡航&#xff08;自动认知所在车道&#xff09;&#xff0c;和一…

php mms,PHP代码示例_PHP账号余额查询接口 | 微米-中国领先的短信彩信接口平台服务商...

PHP余额查询接口代码示例请求$ch curl_init();curl_setopt($ch, CURLOPT_URL, "http://api.weimi.cc/2/account/balance.html");curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);curl_setopt($ch, CURLOPT_POST, TRUE);/*设定微米账号的接口UID和接口密码*/curl_se…

工作经验:Java 系统记录调用日志,并且记录错误堆栈

前言&#xff1a;现在有一个系统&#xff0c;主要是为了给其他系统提供数据查询接口的&#xff0c;这个系统上线不会轻易更新&#xff0c;更不会跟随业务系统的更新而更新&#xff08;这也是有一个数据查询接口系统的原因&#xff0c;解耦&#xff09;。这时&#xff0c;这个系…

ASML光刻机PK 原子弹,难度?

ASML光刻机PK 原子弹&#xff0c;难度&#xff1f; 一. 物理世界和网络世界的交汇点&#xff1a;光刻机 光刻机的技术有多高级&#xff0c;看看这个知乎提问&#xff0c;可以感受一下&#xff1a; 有人这样形容光刻机&#xff1a;这是一种集合了数学、光学、流体力学、高分子…

uniapp 封装 navbar tabbar

最近换了一家公司工作 因为上家公司老板给的钱不多 还特别会压榨员工 好了好了&#xff0c;不扯皮了 1、封装navbar&#xff1a; 首先需要在pages.json中将对应页面的原生navbar给取消 举例&#xff1a; {"pages": [{"path" : "pages/home/inde…

shell访问php文件夹,Shell获取某目录下所有文件夹的名称

Shell获取某目录下所有文件夹的名称以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;Shell获取某目录下所有文件夹的名称, 已知目录D:/temp,获取temp下所有文件夹的名称并输出&#xff0c;She…

深度学习与传统图像识别

深度学习与传统图像识别 概述 传统方法中特征提取主要依赖人工设计的提取器&#xff0c;需要有专业知识及复杂的调参过程&#xff0c;同时每个方法都是针对具体应用&#xff0c;泛化能力及鲁棒性较差。 深度学习主要是数据驱动进行特征提取&#xff0c;根据大量样本的学习能…

matlab getstart,matlab帮助文件(matlab get start.pdf)

【实例简介】Matlab Primer【实例截图】【核心代码】Quick Start1MATLAB Product Description ........................... 1-2Key Features ..................................... 1-2Desktop Basics ....................................... 1-3Matrices and Arrays .....…