复习笔记:一个简单的动态代理实现

interface Eat{
    void eat() ;
}
class RealEat implements Eat{
    public void eat(){
        System.out.println("###真实主题的核心操作###");
    }
}
class EatProxy implements InvocationHandler{
    private Eat eat ;
    public Eat bind(Eat eat){
        this.eat = eat ;
        return (Eat)Proxy.newProxyInstance(eat.getClass().getClassLoader(), eat.getClass().getInterfaces(), this);
    }
    public Object invoke(Object obj,Method method,Object[] args) throws Throwable{
        this.prepare();
        Object obj1 = method.invoke(this.eat, args);
        this.finish();
        return obj1 ;
    }
    private void prepare(){
        System.out.println("代理的准备工作");
    }
    private void finish(){
        System.out.println("代理的收尾工作");
    }
}
public class Test{
    public static void main(String[] args){
        EatProxy proxy = new EatProxy() ;
        Eat eat = proxy.bind(new RealEat()) ;
        eat.eat();
    }
}

运行结果:

代理的准备工作
###真实主题的核心操作###
代理的收尾工作
时间: 2024-10-12 20:54:23

复习笔记:一个简单的动态代理实现的相关文章

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

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

继承?静态代理?写一个自己的动态代理吧

[ 需求分析 ] 在我们实际开发中常常会遇到这样的问题:记录一个类的方法运行时间,以分析性能.一般我们的做法是先在类的开始记录一个开始时间,然后在类的结束记录一个结束时间,二者相减就可以获取我们想要的结果.但是很多时候这些类已经打了jar包,我们无法直接修改源码,这个时候我们应该怎么办呢? 下文使用Tank的移动需要统计时间.记录日志来模拟需求场景,假定Moveable.Tank类无法修改. interface:Moveable public interface Moveable { publi

windows笔记-一个简单的windows GUI应用程序

#include<windows.h> // 编写Windows程序必须包含的头文件 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 声明窗口函数原型 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ HWND hwnd; // 定义窗口句柄 MSG msg; // 定义一个用来存储消息的变量

【Unity Shaders】Reflecting Your World —— 在Unity3D中创建一个简单的动态Cubemap系统

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 我们已经学了很多关于反射的内容,但是我们现在的反射并不能实时反射,即当反射物体移动时它们不

简单实现动态代理(Proxy)

最近学习了Jdk的动态代理,然后自己也简单的手写了一个. 思路: 1.根据代理的接口,生成对应的Java代码文件 2.将生成的Java文件编译成class文件 3.利用URLClassLoader加载class到Jvm中,利用反射在new出这个对象. 代理业务接口 package com.michael.pl; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public i

关于java的一个典型的动态代理

今天看书的一个过程中,看到一个动态代理看下代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy { public static void testDynamicProxy(){ Calculator calculator = new CalculatorImpl(); LogH

Java反射机制剖析(三)-简单谈谈动态代理

通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来控制对这个对象的访问.其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途. 它 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 存在关联关系,一个代理类的对象与一个委托类的对象

0915-----Linux设备驱动 学习笔记----------一个简单的字符设备驱动程序

0.前言 研究生生活一切都在步入正轨,我也开始了新的学习,因为实在不想搞存储,所以就决定跟师兄学习设备驱动,看了两星期书,终于有点头绪了,开始记录吧! 1.准备工作 a)查看内核版本 uname -r b)安装内核源码树(http://www.cnblogs.com/Jezze/archive/2011/12/23/2299871.html) 在www.linux.org上下载源码编译,这里是.xz格式,需要安装解压工具,xz-utils: 解压方法示例:xz -d linux-3.1-rc4.

《COM原理与应用》学习笔记——一个简单的COM组件的实现

今天带来一个简单的COM组件的实现,非常的简单.这个组件只是简单的完成了整数的加减乘除~ 首先,先罗列需要的COM接口,这里需要的接口非常简单,就是加减乘除的接口.所以定义一个ICalc类,当然这个类继承于IUnknown. 1 class ICalc : public IUnknown 2 { 3 public: 4 virtual long __stdcall add(long a, long b) = 0; 5 virtual long __stdcall minus(long a, lo