`

简述java动态代理

阅读更多

一、动态代理简单实现

1、代理类要实现java.lang.reflect.InvocationHandler接口。

2、并重写接口中的public Object invoke(Object proxy, Method method, Object[] args)方法

     proxy:  Proxy类对象(本例中没有用的)

     method: 被代理类实现接口中的所有方法对象

     args: for循环中当前方法参数

3、在invoke方法中加入相应的逻辑,然后执行method.invoke(obj, args);

     obj: 被代理对象

     args: 底层方法参数

4、产生一个代理对象User user =  Proxy.newProxyInstance(arg0, arg1, arg2)

     arg0: User类的加载器

     arg1: 产生的代理对象要实现的接口

     arg2: 代理类的对象

5、例子

 

public class Run {
 
 public static void main(String[] args) {
  
  NewCar car = new NewCar(); //打印基础语句
  TimeProxy ctp = new TimeProxy(); //打印时间语句
  ctp.setObj(car);
  Car carProxy = (Car)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), ctp);
  carProxy.move();//从日子开始语句打印\
 }

}

 

二、动态代理在JDK中的实现

1、Proxy.newProxyInstance(arg0, infce, h)的实现

创建动态代理类及对象

public class Proxy {
 public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASM
  String methodStr = "";
  String rt = "\r\n";
  
  Method[] methods = infce.getMethods();
  for(Method m : methods) {
   methodStr += "@Override" + rt +
       "public void " + m.getName() + "() {" + rt +
       "    try {" + rt +
       "    Method md = " + infce.getName() + ".class.getMethod(\"" + m.getName() + "\");" + rt +
       "    h.invoke(this, md);" + rt +
       "    }catch(Exception e) {e.printStackTrace();}" + rt +
      
       "}";
  }
  
  String src =
   "package com.bjsxt.proxy;" +  rt +
   "import java.lang.reflect.Method;" + rt +
   "public class $Proxy1 implements " + infce.getName() + "{" + rt +
   "    public $Proxy1(InvocationHandler h) {" + rt +
   "        this.h = h;" + rt +
   "    }" + rt +
   
   
   "    com.bjsxt.proxy.InvocationHandler h;" + rt +
       
   methodStr +
   "}";
  String fileName =
   "d:/src/com/bjsxt/proxy/$Proxy1.java";
  File f = new File(fileName);
  FileWriter fw = new FileWriter(f);
  fw.write(src);
  fw.flush();
  fw.close();
  
  //compile
  JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
  Iterable units = fileMgr.getJavaFileObjects(fileName);
  CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
  t.call();
  fileMgr.close();
  
  //load into memory and create an instance
  URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
  URLClassLoader ul = new URLClassLoader(urls);
  Class c = ul.loadClass("com.bjsxt.proxy.$Proxy1");
  System.out.println(c);
  
  Constructor ctr = c.getConstructor(InvocationHandler.class);
  Object m = ctr.newInstance(h);

  return m;
 }
}

2、invoke(this, md)的实现

 

public class TimeHandler implements InvocationHandler{
 
 private Object target;

 

 public TimeHandler(Object target) {
  super();
  this.target = target;
 }

 

 @Override
 public void invoke(Object o, Method m) {
  long start = System.currentTimeMillis();
  System.out.println("starttime:" + start);
  System.out.println(o.getClass().getName());
  try {
   m.invoke(target);
  } catch (Exception e) {
   e.printStackTrace();
  }
  long end = System.currentTimeMillis();
  System.out.println("time:" + (end-start));
 }

}

 

3、 m.invoke(target)调用拥有底层方法的对象

4、例子

public class Client {
 public static void main(String[] args) throws Exception {
  Tank t = new Tank();
  InvocationHandler h = new TimeHandler(t);
  
  Moveable m = (Moveable)Proxy.newProxyInstance(Moveable.class, h);
  
  m.move();
 }
}

分享到:
评论

相关推荐

    简述Java设计模式PPT

    "java设计模式简介" 设计模式是解决软件设计问题的套解决方案,描述了对象和类之间的相互作用。设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用其可以避免一些重复性的工作...

    java反射机制原理和反射机制总结

    - 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理对象。 - 编写通用工具类:如日志、序列化、测试工具等,需要处理各种未知类型的对象。 总结,Java反射机制是Java平台灵活性和动态性的体现,它极...

    Java各个包简述.pdf

    19. **java.lang.instrument**:允许Java代理检测JVM上的程序,用于性能监控或代码修改。 20. **java.lang.management**:管理Java虚拟机及其操作系统的接口。 21. **java.lang.ref**:提供引用对象,允许一定程度...

    Java SSM框架集成的日志功能增强Demo源码

    项目名称:Java SSM框架集成日志功能增强Demo 主要编程语言:Java ...项目利用Java动态代理机制,通过实现InvocationHandler接口,巧妙地运用AOP(面向切面编程)实现了日志功能,增强了应用的可追踪性与维护性。

    Java核心技术 PDF(文字版 有目录 可以复制粘贴文字)

    14. **反射和动态代理**:解释Java反射机制,如何在运行时获取类信息,以及动态代理的实现原理和应用。 15. **Java虚拟机(JVM)**:简述JVM的工作原理,类加载过程,以及如何通过JVM调优提升程序性能。 以上知识...

    JAVA API文档

    10. **反射和动态代理**:`java.lang.reflect`包提供了反射API,允许程序在运行时检查和操作类、接口、字段和方法。动态代理机制则允许在运行时创建实现一组指定接口的新类。 通过`jdk-6u10-api-en`这个压缩包,你...

    《Java核心技术 卷2 高级特性 原书第8版》 PDF+高清+影印+全书签.rar

    4. **反射与动态代理**:Java的反射机制允许程序在运行时检查和操作类、接口、方法和字段。动态代理则允许创建代理类以实现运行时的拦截和增强。这两部分内容对于框架设计和元编程非常重要。 5. **枚举与注解**:...

    java编程基础及应用

    14. **反射机制**:讲解如何在运行时动态获取类的信息,创建对象,调用方法,访问字段,以及动态代理。 15. **泛型**:介绍泛型的使用,如何定义泛型类、接口和方法,以及类型擦除的概念。 以上只是可能涵盖的一些...

    JAVA编程兵书

    10. **JNI与JVM**:简述JAVA本地接口(JNI)用于调用C/C++库,以及JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)和垃圾回收。 11. **设计模式**:结合JAVA语言,讲解常见的设计模式,如单例、工厂...

    10道腾讯的Java面试题答案.zip

    - 答案:反射允许在运行时动态获取类信息,创建和操作对象,实现动态代理,便于实现插件化或框架设计。 7. **设计模式** - 题目:举例说明单例模式的实现方式及其优缺点。 - 答案:单例模式确保一个类只有一个...

    axis生成wsdl的JAVA客户端服务接口

    当有了一个WSDL文件,开发者可以利用工具如Apache Axis将WSDL解析并生成相应的Java客户端 stubs(代理类),这些代理类包含了调用Web服务所需的所有逻辑。 **Apache Axis的工作流程:** 1. **解析WSDL**:首先,...

    Programmation_Orientée_Objet_Java_2020-2021_java_Java_OOP_

    14. **Java高级特性**:涵盖反射、注解、动态代理、模块化系统(Jigsaw)等Java的进阶特性。 课程资料“Programmation Orientée Objet en Java SMI S5 2020-2021.pdf”将详细讲解以上知识点,并通过实例解析和练习...

    使用 CORBA 和 Java IDL.doc

    CORBA的基本概念和工作机制可以简述如下: **CORBA对象模型:** - **客户机(Client):** 发起请求的应用程序或对象,可以调用其他CORBA对象的服务。 - **对象请求代理(ORB):** 负责处理来自客户机的请求并将...

    java的JNI本地调用

    JNI的工作原理类似于代理模式,其中JVM充当了Java代码与本地代码之间的桥梁。具体步骤如下: 1. **定义本地方法**:在Java代码中,通过`native`关键字声明本地方法。 2. **生成JNI头文件**:使用`javah`工具根据...

    Java基础编程贯通教程 ISBN:7302072701 (史斌星,史佳著)

    13. **Java Applet与Servlet**:简述Java Applet在网络上的应用,以及Servlet在Web服务器端处理HTTP请求的基本原理。 随书光盘中可能包含的资源有源代码示例、练习题解答、配套课件等,这些资料有助于读者更好地...

    JAVA相关面试题,Spring面试题

    #### 十二、简述Java内存模型? - **Java内存模型**: Java内存模型主要分为堆内存(Heap Memory)和栈内存(Stack Memory)。堆内存用于存储对象实例,而栈内存用于存储基本类型的变量和对象引用。 #### 十三、...

    JAVA面试题.docx

    以上只是部分知识点的简述,Java面试题涉及广泛,包括但不限于并发编程、JVM内存管理、垃圾回收、Spring框架等,每个话题都值得深入探讨。在面试中,理解和掌握这些知识点将有助于回答各种技术问题。

    JAVA大学简明教程

    12. **JAVA高级特性**:可能包括反射、注解、动态代理等进阶主题。 此外,序-目录-光盘内容及系统要求提供了关于教程的整体结构和学习资源的概述,本书内容简介则进一步阐述了教程的主要内容和目标读者。作者序-...

    Java设计模式导读.pdf

    四、具体设计模式的简述 书中通过实例介绍了许多具体的设计模式,包括单例模式、工厂模式、抽象工厂模式等,并通过UML图示和示例代码对这些模式的内部结构和使用场景进行了详细解读。每一种模式都有其特定的使用背景...

    java笔记.rar

    11. **JVM**:简述Java虚拟机的工作原理,如类加载机制、内存模型(堆、栈、方法区等)、JVM优化等。 12. **泛型**:讲解泛型的引入、使用规则,以及其在集合、方法、接口中的应用。 13. **设计模式**:可能会涉及...

Global site tag (gtag.js) - Google Analytics