博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态代理和静态代理区别
阅读量:4639 次
发布时间:2019-06-09

本文共 3250 字,大约阅读时间需要 10 分钟。

静态代理

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

  

package staticproxy;/** * 实现类 * @author newtouch * */public class Hello implements IHello{	@Override	public void sayHello() {		System.out.println("zhangxiongfeng");			}	@Override	public 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{	@Override	public void sayHello() {		System.out.println("zhangxiongfeng");			}	@Override	public 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接口中的  任何方法都是要用下面的方法执行     *      *  可以不用像静态代理中 每个方法都必须重写      */	@Override	public 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 stub	   IHello 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
{ 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

你可能感兴趣的文章
Apache HttpComponents中的cookie匹配策略
查看>>
冰封的海盗攻略
查看>>
python from entry to abandon
查看>>
Netty4.x中文教程系列(四) 对象传输
查看>>
linux下find命令使用举例、
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
ubuntun 服务器与Mac
查看>>
重温JSP学习笔记--与日期数字格式化有关的jstl标签库
查看>>
java-Date-DateFormat-Calendar
查看>>
封装CLLocationManager定位获取经纬度
查看>>
我的第一篇博客-(Eclipse中或Myeclipse中如果不小心删除了包那可怎么办?)
查看>>
对easyui datagrid组件的一个小改进
查看>>
类似以下三图竞争关系的IT企业
查看>>
Qt5启动画面
查看>>
清明节
查看>>
谈谈一些有趣的CSS题目(七)-- 消失的边界线问题
查看>>
ubuntu如何安装svn客户端?
查看>>
arcgis for javascript (3.17)
查看>>
【MySQL】Win7下修改MySQL5.5默认编码格式
查看>>
AI之路,第二篇:python数学知识2
查看>>