首先:定义一个接口// 只能是一个接口


例:

  package DongTai;

  public interface dongtai {
  public void show();
  }

接着:定义一个被代理类,实现这个接口

例:

  package DongTai;

  public class bei implements dongtai{

  @Override
  public void show() {
  // TODO Auto-generated method stub
  System.out.println("代理类");
  }

  }

再:定义一个代理类,实现InvocationHandler接口,重写该接口的invoke()方法

例:

  package DongTai;

  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;

  import org.omg.CORBA.SystemException;
  import org.omg.CORBA.portable.InputStream;
  import org.omg.CORBA.portable.InvokeHandler;
  import org.omg.CORBA.portable.OutputStream;
  import org.omg.CORBA.portable.ResponseHandler;

  public class bai implements InvocationHandler{
  private Object o;//此处是Object类型的,代表可接受任何类型

  public bai(Object o) {
  super();
  this.o = o;
  }

  @Override
  public Object invoke(Object object, Method method, Object[] arg)throws Throwable {
  System.out.println("调用前");
  method.invoke(o, arg);//method为o的方法,arg为o这个对象的方法的参数
  System.out.println("调用后");
  return null;
  }
  }

最后:

例:

  package DongTai;

  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Proxy;

  public class test {
  public static void main(String[] args) {
  bei b=new bei();//创建被代理类对象

  InvocationHandler in=new bai(b);

  //调用处理程序,创建代理类对象,向其构造器中传入被代理类对象,因为实现了InvocationHandler,利用多态转为InvocationHandler型
  Class classType=in.getClass();//创建in的Class类

  dongtai daili=(dongtai) Proxy.newProxyInstance(//实现一个新的代理类,转为接口类
  classType.getClassLoader(), b.getClass().getInterfaces(), in);//参数含义:1.类加载器 2.被代理所实现的接口 3.动态类转为InvocationHandler的实例

  注:上面两行代码,在运行中动态的创建一个代理类,用代理类的类加载器实现被代理类的接口,交给实现InvocationHandler接口的代理类
  daili.show();//调用代理类的方法
  }
  }

java 动态代理总结的更多相关文章

  1. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  2. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  3. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  4. Java 动态代理作用是什么?

    Java 动态代理作用是什么?   1 条评论 分享   默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...

  5. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

  6. java 动态代理示例,带主要注释

    Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...

  7. java动态代理浅析

    最近在公司看到了mybatis与spring整合中MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接口的动态代理类. 于是想起了java的动态代理,然后就有了这篇文章 ...

  8. Java 动态代理

    被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...

  9. [转]java动态代理(JDK和cglib)

    转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...

  10. java动态代理模式

    java动态代理机制详解 Spring的核心AOP的原理就是java的动态代理机制. 在java的动态代理机制中,有两个重要的类或接口: 1.InvocationHandler(Interface): ...

随机推荐

  1. Unity shader学习之折射

    shader如下: Shader "Custom/Refraction" { Properties { _Cubemap("Cubemap", Cube) = ...

  2. 2. Python3输入与输出

    数据的输入和输出操作是计算机最基本的操作,本节只研究基本的输入与输出,基本输入是指从键盘上输入数据的操作,基本输出是指屏幕上显示输出结果的操作. 2.1基本输入和输出 常用的输入与输出设备有很多,如摄 ...

  3. 学习笔记<4>初步控件布局

    一.控件布局基本概念 指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性 二.控件布局两种方法 1.使用布局文件完成控件布局(eclipse可视化拖拽控件实现) 2.在JAVA代码 ...

  4. python 爬qidian小说

    import re import urllib.request from bs4 import BeautifulSoup import time url=input("第一章网址:&quo ...

  5. CentOS下nginx+php的配置及nginx开机启动配置

    关闭防火墙 (不然外链接是访问不了 apache) service iptables stop 关闭安全系统 SELinux( 不然报403 访问页面错误 ) 1.Nginx安装主要在于配置文件的修改 ...

  6. html5-css列表和表格

    td{    /*width: 150px;    height: 60px;*/    padding: 10px;    text-align: center;} table{     width ...

  7. 特征点方法 - Harris和SURF的手工实现

    整理去年做的小项目,纪念我的图像处理入门. 因为要在DSP上实现,所以完全手工C代码垒起来的,还要保证和PC端跑的结果一样,觉得可能特殊场景会有用,上传github,没有依赖任何库: 格式注释什么的暂 ...

  8. ODBC数据库

    ODBC数据源全称是开放数据库互连(Open Database Connectivity),在微软公司开放的数据库结构中的一部分,其实是一个应用程序的接口,主要用于提供数据库的编写应用程序的能力.

  9. 动态创建生成lambd表达式

    基于网上找的一段代码进行修改,目前扩展了NotContains方法的实现 using System; using System.Collections.Generic; using System.Co ...

  10. C/C++编译、链接、运行的基础知识

    0.C/C++从源文件在编译器的作用下先编译成.s的汇编,然后在汇编器的作用下变成.o的可重定向目标文件,然后在链接器的作用下变成可执行文件 1.在项目中设置的编译寻找目录中的.h文件(一般就是inc ...