Java笔记之对象代理实例

 代码如下 复制代码

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

//代理需要实现的接口
interface IVehical {

    //例如我这里写了两个接口
    void run();
    void say();
}

//concrete implementation
 class Car implements IVehical{

    //下面这两个方法,作为接口的实现方法,如果接口中没有这些方法,而在这里出现了多余的方法程序将编译不过。
    //每次调用这两个方法都会触发代理对象中的invoke方法。
    public void run() {
    System.out.println("Car is running");
    }
   
    public void say()
    {
        System.out.println("just one!");
    }

}

//proxy class
//这个类是用来创建代理对象的,这里只是对它进行了简单的封装
class VehicalProxy {

    private IVehical vehical;

    public VehicalProxy(IVehical vehical) {
    this.vehical = vehical;
    }
    //这个方法返回创建后的对象代理
    public IVehical create(){
    final Class<?>[] interfaces = new Class[]{IVehical.class};
    final VehicalInvacationHandler handler = new VehicalInvacationHandler(vehical);
   
    return (IVehical) Proxy.newProxyInstance(IVehical.class.getClassLoader(), interfaces, (InvocationHandler) handler);
    }
    //这个是跟代理对象绑定的一个处理器,www.111cn.net每次调用对象代理中的方法都会触发这个处理器中的invoke方法
    class VehicalInvacationHandler implements InvocationHandler{

    private final IVehical vehical;
   
    public VehicalInvacationHandler(IVehical vehical) {
        this.vehical = vehical;
    }

    //每当执行对象代理的say或者call(只要是IVehical接口中的方法)就会触发invoke被执行
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {

        System.out.println("--before running...");
        Object ret = method.invoke(vehical, args);
        System.out.println("--after running...");
       
        return ret;
    }
   
    }
}

class Main {
    public static void main(String[] args) {
   
    IVehical car = new Car();
    VehicalProxy proxy = new VehicalProxy(car);
   
    IVehical proxyObj = proxy.create();
    proxyObj.say();
    }
}

/*
 * 程序运行之后将打印如下信息,因此我们可以看出对象的代理可以往特定对象的方法中添加附带的执行代码,
 * 这个的作用在我们需要对一个做日志或者bug调试的时候非常有作用,因为我们不应该把调试代码或者是打
 * 印日志代码写在对象中,这样我们就可以将日志的代码添加到对象的代理中,从而将业务与程序的框架相
 * 关的功能分离,从而保证了代码的“纯净性”。
 * output:
 * --before running...
 * Car is running
 * --after running...
 * */

时间: 2024-10-28 14:37:08

Java笔记之对象代理实例的相关文章

spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析

JDK动态代理技术 动态代理最常见应用是AOP(面向切面编程).通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法.对象.入参.返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的新需求,比如日志记录等. 动态代理常见有两种方式:基于JDK的反射技术的动态代理和基于CGLib的动态代理. 使用反射技术创建动态代理 JDK创建动态代理的核心是java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类.让我们先分

spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析

CGLib动态代理基本原理 CGLib--Code Generation Library,它是一个动态字节代码生成库,基于asm.使用CGLib时需要导入asm相关的jar包.而asm又是何方神圣? asm是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称

java 反射和动态代理详解及实例代码_java

一.java中的反射 1.通过反射加载类的属性和方法实例代码: /** * java.lang.Class 是反射的源头 * 我们创建了一个类,通过编译(javac.exe)生成对应的class文件,之后我们通过java.exe加载(jvm的类加载器加载)此class文件 * 此class文件加载到内存后,就是一个运行时类,存在缓存区,这个运行时类本事就是一个Class的实例 * 每一个运行时类只加载一次, */ Class<StudentExam> clazz = StudentExam.c

Java中的对象和对象引用实例浅析

  本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Jav

java教学笔记之对象的创建与销毁_java

本课程的目标是帮你更有效的使用Java.其中讨论了一些高级主题,包括对象的创建.并发.序列化.反射以及其他高级特性.本课程将为你的精通Java的旅程提供指导. 1. 引言 在TIOBE 编程语言排名中,Sun 公司于1995年开发的Java语言是世界上使用最广泛的编程语言之一.作为一种通用编程语言,因为强大的工具包和运行时环境.简单的语法.丰富的平台支持(一次编写,到处运行)以及的异常活跃的社区支持,Java语言对软件开发工程师极具吸引力. 在这一系列的文章中,涵盖了Java相关的高级内容,因此

java对象转型实例分析_java

本文实例讲述了java对象转型的概念,分享给大家供大家参考.具体方法如下: 对象转型(casting)注意事项如下: 1.一个基类的引用类型变量可以"指向"其子类的对象. 2.一个基类的引用不可以访问其子类对象新增加的成员(属性和方法). 3.可以使用 引用变量 instanceof 类名 来判断该引用型变量所"指向"的对象是否属于该类或该类的子类. 4.子类的对象可以当做基类的对象来使用称作向上转型(upcasting),反之成为向下转型(downcasting)

java中request对象各种方法的使用实例分析_java

本文实例讲述了java中request对象各种方法的使用.分享给大家供大家参考,具体如下: request对象是从客户端向服务器端发出请求,包括用户提交的信息以及客户端的一些信息.request对象是javax.servlet.http.HttpServletRequest类的实现实例. request对象封装了浏览器的请求信息,通过request对象的各种方法可以获取客户端以及用户提交的各项请求信息. 使用request对象获取客户端提交的请求参数的常用方法如下: 1.String getPa

Java中的对象和对象引用实例浅析_java

本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编

Java中的动态代理模式

前言: 最近一直在分析hadoop的RPC机制.在hadoop中,DataNode和NameNode之间的控制信息的交流是通过RPC机制完成的,采用的是动态代理和java NIO的方式.DataNode端是通过获得NameNode的代理,通过该代理和NameNode进行通信的,为了更好的分析hadoop的RPC机制我想先分析一下动态代理是怎么实现.下面就是动态代理的最最简单的代码实现,我们一起来看看吧. 代码如下: package cn.xiaolu; import java.lang.refl