先定义一个接口,根据代理模式的原理,被代理类与代理类都要实现它。

public interface Person {
void eat();
}

再写一个实际执行任务的类(被代理类):

public class RealPerson implements Person {
@Override
public void eat() {
System.out.println("I am eating");
}
}

代理类的写法:写一个InvocationHandler的子类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class PersonProxyHandler implements InvocationHandler {
private Person man; public PersonProxyHandler(Person man) {
this.man = man;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before eating");
Object res = method.invoke(man, args);
System.out.println("after eating");
return res;
} }

按照常规想法,代理类要拥有一个被代理类对象的引用,然后在invoke方法中,method.invoke(man, args); 这一句代码表明对实际对象的调用,其余代码就是AOP增强了。

主类:

import java.lang.reflect.Proxy;

public class Solution {

    public static void main(String[] args) {
RealPerson man = new RealPerson();
PersonProxyHandler realHandler = new PersonProxyHandler(man); Person proxy = (Person) Proxy.newProxyInstance(
Person.class.getClassLoader(),
new Class[]{Person.class},
realHandler);
proxy.eat();
}
}

运行main方法,控制台打印如下:

before invoke
is eating
after invoke

这种代理方式也称为“JDK动态代理”

Proxy.newInstance与InvocationHandler的使用示例的更多相关文章

  1. 从Proxy.newInstance出发

    写在前面 本篇博客是基于对动态代理,java的重写,多态特性了解的基础上对于源码的阅读,先提出几个问题 1.从静态代理变成动态代理需要解决两个问题,如何动态实现被代理类的接口并摘取接口中的方法,如果动 ...

  2. Proxy 动态代理 InvocationHandler CGLIB MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. JDK的动态代理深入解析(Proxy,InvocationHandler)(转)

    JDK的动态代理深入解析(Proxy,InvocationHandler)(转) 一.什么是动态代理 动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的 ...

  4. 动态代理 Proxy InvocationHandler

      前奏 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常 ...

  5. java代理的深入浅出(一)-Proxy

    java代理的深入浅出(一)-Proxy 1.什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事 ...

  6. 设计模式——proxy代理模式

    目录 概述 定义 角色 为什么会有代理模式? 应用场景 示例 静态代理 例子 动态代理 JDK中生成代理对象的API 代码示例: 代码示例2 Cglib代理 代码示例 AOP(AspectOrient ...

  7. Java的动态代理(dynamic proxy)

    什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...

  8. Proxy 代理模式

    简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...

  9. Dynamic proxy

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

随机推荐

  1. linux读xml文件问题

    由于从配置文件中读取到的路径名的最后多了个0x0A,害我折腾了半天. 提示也很奇葩: I/O warning : failed to load external entity 关键是从这个提示看不出是 ...

  2. 技术选型之Docker容器引擎

    https://mp.weixin.qq.com/s?__biz=Mzg3NjAyOTUzMQ==&mid=2247484524&idx=1&sn=ac041bf3e36dda ...

  3. ORA-00904: "B"."METHOD": 标识符无效,00904. 00000 - "%s: invalid identifier"

    1 SELECT COUNT(1) FROM (SELECT a.id AS "id", a.district AS "district", a.company ...

  4. Jmeter之Cookie和Session处理

    Jmeter之Cookie和Session处理 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: 2.Session 添加方式:线程组-前置处理器 -HTTP U ...

  5. 使用gimp画线、矩形、圆等

    使用gimp画线.矩形.圆等 https://blog.csdn.net/tody_guo/article/details/7628508 2012年06月03日 19:08:47 Tody Guo  ...

  6. Python深入学习之特殊方法与多范式

    Python深入学习之特殊方法与多范式 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来 ...

  7. 面向对象编程(oop)的变迁

    作者:匿名用户链接:https://www.zhihu.com/question/34018003/answer/132740170来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  8. subprocess.call 使用

    1.subprocess.call 里面的命令分开写,实例如下: subprocess.call 是不能作为赋值的,需要用到 subprocess.check_output 函数,而且如果要引用赋值就 ...

  9. cmake生成Makefile时指定c/c++编译器

    cmake .. -DCMAKE_CXX_COMPILER:FILEPATH=/usr/local/bin/g++ -DCMAKE_C_COMPILER:FILEPATH=/usr/local/bin ...

  10. Postman接口测试:自动获取登录后的cookie并设置环境变量

    在对网站进行接口测试的时候,很多请求往往是需要带登录的cookie才能请求成功的,一般来说,可以用抓包软件(fiddler,浏览器的F12)来查看登录后的cookie,并把它设置到postman的环境 ...