静态代理

  1. package staticproxy;
  2.  
  3. /**
  4. * 接口
  5. * @author newtouch
  6. *
  7. */
  8. public interface IHello {
  9.  
  10. public void sayHello();
  11.  
  12. public String doSomethong(String s);
  13.  
  14. }

  

  1. package staticproxy;
  2.  
  3. /**
  4. * 实现类
  5. * @author newtouch
  6. *
  7. */
  8. public class Hello implements IHello{
  9.  
  10. @Override
  11. public void sayHello() {
  12. System.out.println("zhangxiongfeng");
  13.  
  14. }
  15.  
  16. @Override
  17. public String doSomethong(String s) {
  18.  
  19. return s;
  20. }
  21.  
  22. }

  

  1. package staticproxy;
  2.  
  3. /**
  4. * 静态代理类
  5. * @author newtouch
  6. *
  7. */
  8. /**
  9. *
  10. * @author newtouch
  11. *
  12. * 问题 如果接口中有多个方法 静态代理中 就会有多重新代理的方法
  13. *
  14. */
  15. public class StaticProxy {
  16.  
  17. private IHello iHello;
  18.  
  19. public StaticProxy(IHello iHello) {
  20. this.iHello=iHello;
  21. }
  22.  
  23. public void sayHello() {
  24. iHello.sayHello();
  25. }
  26.  
  27. public String doSomethong(String s) {
  28.  
  29. return iHello.doSomethong(s);
  30. }
  31.  
  32. }

  

  1. package staticproxy;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. IHello iHello = new Hello();
  8.  
  9. StaticProxy staticProxy = new StaticProxy(iHello);
  10.  
  11. staticProxy.sayHello();
  12.  
  13. System.out.println(staticProxy.doSomethong("zhangxiongfeng"));
  14.  
  15. }
  16.  
  17. }  

动态代理:

  1. package proxy;
  2.  
  3. /**
  4. * 接口
  5. * @author newtouch
  6. *
  7. */
  8. public interface IHello {
  9.  
  10. public void sayHello();
  11.  
  12. public String doSomethong(String s);
  13.  
  14. }

  

  1. package proxy;
  2.  
  3. public class Hello implements IHello{
  4.  
  5. @Override
  6. public void sayHello() {
  7. System.out.println("zhangxiongfeng");
  8.  
  9. }
  10.  
  11. @Override
  12. public String doSomethong(String s) {
  13.  
  14. return s;
  15. }
  16.  
  17. }

  

  1. package proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. public class DynamicProxy implements InvocationHandler {
  7.  
  8. private IHello iHello;
  9.  
  10. DynamicProxy(IHello iHello) {
  11. this.iHello = iHello;
  12. }
  13.  
  14. /**
  15. * 调用接口 IHello接口中的 任何方法都是要用下面的方法执行
  16. *
  17. * 可以不用像静态代理中 每个方法都必须重写
  18. */
  19. @Override
  20. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  21. //  在代理真实对象前我们可以添加一些自己的操作
  22. System.out.println("before rent house");
  23.  
  24. System.out.println("Method:" + method);
  25.  
  26. // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
  27. method.invoke(iHello, args);
  28.  
  29. //  在代理真实对象后我们也可以添加一些自己的操作
  30. System.out.println("after rent house");
  31.  
  32. return null;
  33. }
  34. }

  

  1. package proxy;
  2.  
  3. import java.lang.reflect.Proxy;
  4.  
  5. public class Test {
  6.  
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9.  
  10. IHello iHello = new Hello();
  11.  
  12. DynamicProxy dynamicProxy = new DynamicProxy(iHello);
  13.  
  14. IHello hello = (IHello) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), iHello.getClass().getInterfaces(), dynamicProxy);
  15.  
  16. // hello.sayHello();
  17.  
  18. System.out.println(hello.doSomethong("zhangxf"));
  19.  
  20. }
  21.  
  22. }

  动态代理执行:

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

  1. package proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Proxy;
  5.  
  6. public class ProxyFactory<T> {
  7.  
  8. private T t;
  9.  
  10. private InvocationHandler invocationHandler;
  11.  
  12. public ProxyFactory(T t,InvocationHandler invocationHandler) {
  13. this.t = t;
  14. this.invocationHandler = invocationHandler;
  15. }
  16.  
  17. public T newProxyInstance() {
  18.  
  19. return (T)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(), t.getClass().getInterfaces(), invocationHandler);
  20.  
  21. }
  22. }
  23.  
  24. 动态工厂

  

Java动态代理和静态代理区别的更多相关文章

  1. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  2. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

  3. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  4. Java设计模式学习06——静态代理与动态代理(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...

  5. Java动态代理与静态代理以及它能为我们做什么

    相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...

  6. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  7. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  8. java 基础 --- 动态代理和静态代理

    问题  : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...

  9. Java代理(静态代理、JDK动态代理、CGLIB动态代理)

    Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...

  10. SpringAOP用到了什么代理,以及动态代理与静态代理的区别

    spring aop (面向切面)常用于数据库事务中,使用了2种代理. jdk动态代理:对实现了接口的类生成代理对象.要使用jdk动态代理,要求类必须要实现接口. cglib代理:对类生成代理对象. ...

随机推荐

  1. jQuery笔记三——text/html/val/attr/prop

    1.获得内容 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() ...

  2. c# 连等算式都在做什么

    在研究两个整数互换的方法时(详细看这里),发现了一个有趣的现象. a ^= b ^= a ^= b; ≠ a ^= b;b ^= a;a ^= b; 有兴趣的童鞋可以看看下面代码的结果是什么: int ...

  3. CREATESTRUCT cs 结构体

    PreCreateWindow(CREATESTRUCT& cs) typedef struct tagCREATESTRUCT { LPVOID lpCreateParams; // 创建窗 ...

  4. 超级简单却不知道:html标签的嵌套规则

    XHTML的标签有许多:div.ul.li.dl.dt.dd.h1~h6.p.a.addressa.span. strong……我们在运用这些标签搭建页面结构的时候,是可以将它们无限嵌套的,但是,嵌套 ...

  5. mysql 删除

    DROP删表,表结构将删了,当然数据也不存在了 TRUNCATE和DELETE删数据,表结构还在 DELETE可以带条件删除,TRUNCATE是全部删除 DELETE删除会写日志,TRUNCATE不写 ...

  6. ORACLE 数据库优化原则

    ORACLE 数据库优化原则 一.SQL语句用大写的: 因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再厉行. 二.避免在索引列上利用NOT等闲 我们要避免在索引列上利用NOT, NO ...

  7. ubuntu lapack安装与使用

    https://blog.csdn.net/zouyu1746430162/article/details/53374693 https://blog.csdn.net/mlnotes/article ...

  8. e822. 监听JScrollPane的滚动

    A scrollbar in a scroll pane fires adjustment events whenever its value changes. // Create a scrolla ...

  9. e740. 向标签中加入一个图标

    This example creates a JLabel component with an icon. // Fetch icon Icon icon = new ImageIcon(" ...

  10. TPshop隐藏index.php

    有些朋友提到关于TPshop 隐藏index.php 一问题, 可以修改 Application\Common\Conf\config.php 文件代码 'common', 'AUTH_CODE' = ...