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

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. tensorflow实现线性回归、以及模型保存与加载

    内容:包含tensorflow变量作用域.tensorboard收集.模型保存与加载.自定义命令行参数 1.知识点 """ 1.训练过程: 1.准备好特征和目标值 2.建 ...

  2. Python——GUI编程 控件及常用信号

    QSlider类中的常用信号 valueChanged: 当滑块位置发生改变时触发此信号 sliderPressed: 当用户按下滑块时触发此信号 sliderMoved: 当用户拖动滑块时触发此信号 ...

  3. c语言小端转大端

    //小端转大端 int little2big(int le) { | (le & | (le & | (le >> ) & 0xff; } //大端转小端 int ...

  4. Spring RedisTemplate常用方法(List,Hash)

    @Autowired private RedisTemplate<String, String> redisTemplate; @Override public List<Strin ...

  5. Tomcat服务org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space

    一个运行了很久的项目,最近忽然报错:OOM( java.lang.OutOfMemoryError: Java heap space),异常如下 org.springframework.web.uti ...

  6. [转] ansible批量执行命令展示

    [From] https://blog.csdn.net/zhydream77/article/details/81223805 ansible命令基础 • ansible <host-patt ...

  7. 比较Json.Net和fastJson的效率

    var zoo1 = new zoo(); zoo1.animals = new List<animal>(); zoo1.animals.Add(new cat()); zoo1.ani ...

  8. U盘安装Ubuntu Server CD-ROM挂载失败

    U盘安装 Ubuntu Server 发生Failed to copy file from CD-ROM问题 使用UltraISO制作Ubuntu Server安装盘,在安装过程中出现[!!] Loa ...

  9. Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence)

    Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母. ...

  10. 树莓派4B 串口通信

    提前下载安装Glade图形编辑器 参考 树莓派4B安装netcore 环境部署.发布.执行操作 准备串口设备本文使用串口控制继电器设备 如图 1.发现串口 void GetSerialPort() { ...