`
眼光独到
  • 浏览: 63486 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

JDK动态代理原理及实现

阅读更多

      代理是基本的设计模式之一,它为你提供额外的或者不同的操作。JAVA动态代理比代理的思想更迈进了一步,在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并且确定相应的对策,动态代理中,接口中声明的所有方法都被转移到一个集中的地方处理,也就是invoke()中。

 

定义目标接口:

public interface UserManager {
 public void addUser(String name,String password);
 public void findUser(String id);
}

目标接口的实现类:

public class UserManagerImpl implements UserManager{
 public void addUser(String name, String password) {
  System.out.println("name:"+name+"   password:"+password);
 }

 public void findUser(String id) {
  System.out.println("id:"+id);
 }
}

动态代理对象类,实现InvocationHandler 接口:
public class DynamicProxy implements InvocationHandler {
 // 目标对象
 private UserManager userManager;

 // 通过构造方法传入目标对象
 public DynamicProxy(UserManager userManager) {
  this.userManager = userManager;
 }
 //根据传入的目标返回一个代理对象
 public Object newProxy(){
  //第一个参数指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器
  //第二个参数要实现和目标对象一样的接口,所以只需要拿到目标对象的实现接口
  //第三个参数表明这些被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法
  return Proxy.newProxyInstance(userManager.getClass().getClassLoader(),
    userManager.getClass().getInterfaces(), this);
 }
 
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  Object result = null;
  try {
   //反射调用目标对象的方法
   result = method.invoke(userManager, args);
   check();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return result;
 }
 public void check(){
  System.out.println("通过代理执行该方法");
 }
}

实现类:

public class Invocation {
 public static void main(String[] args) {
  DynamicProxy dp = new DynamicProxy(new UserManagerImpl());
  UserManager user = (UserManager)dp.newProxy();
  
  user.addUser("song", "123456");
  user.findUser("1");
 }
}

    首先对InvocationHandler 类传入目标对象接口,只能对接口进行处理,通过目标接口返回动态代理的目标对象,此时是一个代理对象,当调用该代理对象的方法时,执行inovke()方法,实现动态代理。

分享到:
评论
1 楼 wangfy1685 2011-12-08  
这个不能算是原理,仅仅是使用。哥们!

相关推荐

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的...jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理。 动态代理可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。

    JDK动态代理的底层实现原理

    JDK动态代理的底层实现原理

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring Aop的底层实现技术 --- Jdk动态代理原理 很不错的一篇文章

    jdk与cglib动态代理与底层实现

    代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。

    两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    代理模式及手实现动态代理(aop原理)一、代理模式1. 定义2. 示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态...

    Java JDK动态代理实现原理实例解析

    主要介绍了Java JDK动态代理实现原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    JDK动态代理: 我们将详细介绍JDK动态代理的概念和工作原理。您将了解如何使用Java的反射机制来创建代理对象,以及如何将横切逻辑注入到目标方法中。我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。...

    代理机制及AOP原理实现

    spring中动态代理机制的实现原理及AOP实现原理,JDK的反射,cglib类。

    基于框架的Web开发-静态代理和动态代理原理.docx

    Java动态代理的实现 1 程序架构 创建包proxy.jdk,里面包含下面类和接口,详见批注。 类,实现了UserDao接口接口类测试类,包含main方法 类,实现了UserDao接口 接口 类 测试类,包含main方法 2 功能需求 (1) ...

    jdk动态代理

    剖析java动态代理实现机制,只有明白了原理才会应用。详细请看代码

    Java 动态代理.md

    动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。 在了解动态代理前,我们需要先了解一下什么是代理模式。 代理模式 代理模式...

    动态代理.xmind

    该思维导图主要讲解了代理模式的具体实现,包括...其中jdk代理主要讲解了其具体的实现方式、原理、缺点、缓存机制等。Cglib代理主要讲解了其原理、与JDK代理的对比、Enhancer源码解析、methodProxy和Fastclass源码等。

    Java设计模式及应用场景之《代理模式》

    文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤JDK动态代理示例JDK动态代理实现原理JDK动态代理局限性2、CGLIB动态代理CGLIB...

    struts 拦截器动态代理

    里面是自己实现struts拦截器的一个原理,基于jdk的动态代理

    Spring AOP代理详细介绍

    如果一个类实现了一个或多个接口,那么Spring就会使用默认的JDK动态代理,如果没有实现任何接口,就会使用cglib来代理。当然我们也可以手动改变这些设置。这也是比较容易掉坑的部分,如果设置错了代理方式,那么在...

    基于netty + SpringBoot仿照dubbo手动实现RPC远程本地无感知调用项目源码

    JDK动态代理。 Spring 的扫描原理(@CompanScan,@MapperScan 同理) Spring的事件监听与处理, 反射,SpringListener 配置,负债均衡随机算法。 通过Spring注解形式启用RPC,接口暴露扫描,Rpc接口注解引用。 ...

    java基础面试题目,常见的几个java面试题目:说一下java类集;JDK 和 JRE 有什么区别

    动态代理是怎么实现的;final 在 Java 中有什么作用; Java 中的 Math. round(-1. 5) 等于多少;String 属于基础的数据类型吗;String str="i"与 String str=new String("i")一样吗;如何将字符串反转;等等

    MyBatis知识点总结.ppt

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是...Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象pro

    cglib.jar下载

    它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态...

Global site tag (gtag.js) - Google Analytics