动态代理-实例解析

转自http://weixiaolu.iteye.com/blog/1477774

动态代理实例如下所示:

package cn.xiaolu;

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

/**
 * 动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能。
 * 那么什么是动态代理呢?
 * 我们平常说的代理类是指: 给每个具体类写一个代理类,以后要使用某个具体类时,只要创建它的代理类的对象,然后调用代理类的方法就可以了。
 * 可是如果现在有许多的具体类,那就需要有许多的代理类才可以,这样很显然不合适。所以动态代理就应运而生了,我们只要写一个类实现
 * InvocationHandler 并实现它的invoke方法,然后再用Proxy的工厂方法newProxyInstance()创建一个代理对象,这个对象同样可以实现对具体类的代理功能。
 * 而且想代理哪个具体类,只要给Handler(以下代码中的Invoker)的构造器传入这个具体对象的实例就可以了。感觉是不是自己为该具体类造了一个代理类呢?呵呵~
 */

//接口类
interface AbstractClass {

    public void show();

}

// 具体类A
class ClassA implements AbstractClass {

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("我是A类!");
    }
}

// 具体类B
class ClassB implements AbstractClass {

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("我是B类!");
    }
}
//动态代理类,实现InvocationHandler接口
class Invoker implements InvocationHandler {
    AbstractClass ac;

    public Invoker(AbstractClass ac) {
        this.ac = ac;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] arg)
            throws Throwable {
        //调用之前可以做一些处理
        method.invoke(ac, arg);
        //调用之后也可以做一些处理
        return null;
    }
}

/**
 * 测试类
 * @author 小路
 */
class DynamicProxyTest {

    public static void main(String[] args) {
        //创建具体类ClassB的处理对象
        Invoker invoker1=new Invoker(new ClassA());
        //获得具体类ClassA的代理
        AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(
                AbstractClass.class.getClassLoader(),
                new Class[] { AbstractClass.class }, invoker1);
        //调用ClassA的show方法。
        ac1.show();

        //创建具体类ClassB的处理对象
        Invoker invoker2=new Invoker(new ClassB());
        //获得具体类ClassB的代理
        AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(
                AbstractClass.class.getClassLoader(),
                new Class[] { AbstractClass.class }, invoker2);
        //调用ClassB的show方法。
        ac2.show();

    }
}

可以看出动态代理类,实现InvocationHandler接口,便可实现动态代理。

结果如下:

我是A类!
我是B类!
时间: 2024-10-25 22:23:12

动态代理-实例解析的相关文章

java动态代理原理解析

DamInterface; public interface DamInterface { public void sayHello(); public int sayHelloa(); } DamImpl; public class DamImpl implements DamInterface { @Override   public void sayHello() {     System.out.println("Hello");   } @Override   public 

Spring AOP之 动态代理实例

1.项目结构图如下3.3.3.1: 图3.3.3.1 2.IUserServ接口代码与UserServImpl实现类代码和上述代码相同 3.LogHandler类代码 public class LogHandler implements InvocationHandler { //目标对象 private Object targetObject; /** * 创建动态代理类 * @return object(代理类) */ public Object createProxy(Object tar

JAVA动态代理机制解析

1. 概述 首先,我们来思考如下两个问题: 什么是代理模式?为什么要使用代理模式? 简单总结一下,所谓的代理模式就是在原有的服务上多加一个占位,通过这个占位去控制服务的访问.通过代理模式,一方面可以控制如何访问真正的服务对象,提供额外服务:另一方面,有机会通过重写一些类来满足特定的需要. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现动态代理所必须用到的.下面我们具体分

【Mybtais】Mybatis 插件 Plugin开发(一)动态代理步步解析

需求: 对原有系统中的方法进行'拦截',在方法执行的前后添加新的处理逻辑. 分析: 不是办法的办法就是,对原有的每个方法进行修改,添加上新的逻辑:如果需要拦截的方法比较少,选择此方法到是会节省成本.但是面对成百上千的方法怎么办?此时需要用到动态代理来实现. 场景: 例如:对原有的系统添加日志记录.添加性能分析等等... 举例: 如下,需要对Sleep对象的sleep方法进行"拦截",并在此方法的执行前后添加新的逻辑.想知道'睡觉前干了什么?睡觉后干了什么?' interface Sle

java动态代理实例

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { Target target = (Target)Proxy.newProxyInstance(TargetImpl.class.getClassLoa

一个简单 JDK 动态代理的实例

动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsatance(ClassLoader loader,Class[] interfaces,InvocationHandler,handler) 来创建一个代理 通过代理来调用方法 简单的动态代理实例 1 package com.sean.zzzjvm; 2 3 import java.lang.refl

java动态代理和cglib动态代理

动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的. 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理. Java API提供的动态代理是基于类反射实现的,用到的类有: java.lang.reflect.InvocationHandler; java.lang.reflect.Method; java.lang.reflect.Proxy; 其实现是通过Proxy类的newProxyInstance()方法产

Java开发人员必懂的基础——反射与动态代理

Java的反射与动态代理是java体系结构中较为底层的知识,初学者可能觉得没有太大的用处,但他们确实著名Spring框架IOC和AOP所用的最重要的内容.当我们需要开发更基础,更广泛的的代码时,就会用到这学知识了. 在此之前,我们先来了解一下java的类加载机制 JVM与类加载机制: /* * 1.JVM:当调用java命令来运行某个java程序时,该命令会启动一个java虚拟机进程,同一个JVM中的所有线程,所有变量都处于同一个进程里,都使用该JVM的内存区 * 2.JVM:运行下面两个测试类

【转载】Java 动态代理

Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析者:Caij,校对者:Trinea,校对状态:完成 1. 相关概念 1.1 代理 在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理.这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类.代理