一个简单 JDK 动态代理的实例
动态代理的步骤:
- 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法。
- 创建被代理的类和接口
- 通过 Proxy 的静态方法 newProxyInsatance(ClassLoader loader,Class[] interfaces,InvocationHandler,handler) 来创建一个代理
- 通过代理来调用方法
简单的动态代理实例
1 package com.sean.zzzjvm;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6
7 /** * * @Author Sean * @Date 2017/8/20 21:43. * @Version */
8 public class DynamicProxyTest {
9
10 // 定义一个接口
11 interface IHello{
12 void sayHello();
13 }
14
15 // 实现该接口的类
16 static class Hello implements IHello{
17
18 @Override
19 public void sayHello() {
20 System.out.println("hello world");
21 }
22 }
23
24 // 创建一个动态代理类,实现 InvocationHandler 接口
25 static class DynamicProxy implements InvocationHandler{
26 Object originalObj;
27
28 // 创建一个代理的方法,在 new DynamicProxy().bind(new Hello()); 执行
29 Object bind (Object originalObj){
30 this.originalObj = originalObj;
31 // 返回一个代理对象
32 return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),
33 originalObj.getClass().getInterfaces(),this);
34 }
35
36 // 默认重写的方法,在 hello.sayHello() 执行
37 @Override
38 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
39 System.out.println("welcome");
40 return method.invoke(originalObj,args);
41 }
42 }
43
44 public static void main(String[] args){
45 // IHello hello = new Hello();
46 // 调用动态代理的方法
47 IHello hello = (IHello) new DynamicProxy().bind(new Hello());
48 hello.sayHello();
49 }
50
51 }
一个简单 JDK 动态代理的实例的更多相关文章
- 一个简单JDK动态代理的实例
动态代理的步骤: 创建一个实现了InvocationHandler接口的类,必须重写接口里的invoke()方法. 创建被代理的类和接口 通过Proxy的静态方法 newProxyInsatance( ...
- python爬虫系列:做一个简单的动态代理池
自动 1.设置动态的user agent import urllib.request as ure import urllib.parse as upa import random from bs4 ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- JDK动态代理为什么必须要基于接口?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...
- JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- 解析JDK动态代理实现原理
JDK动态代理使用实例 代理模式的类图如上.关于静态代理的示例网上有很多,在这里就不讲了. 因为本篇讲述要点是JDK动态代理的实现原理,直接从JDK动态代理实例开始. 首先是Subject接口类. p ...
- JDK动态代理实现简单AOP--转
JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...
- JDK动态代理实例
最近看<深入浅出MyBatis技术原理与实战>这本书时,里面讲到Mapper接口的内部实现是通过JDK动态代理生成实现类,联想到之前看<SPRING技术内幕>这本书里也常常提到 ...
随机推荐
- NO.9: 令operator=返回一个reference to *this
1.令赋值操作返回一个reference to *this(除非你有个标新立异的理由,那就随大众- - )
- vue2.0 之文本渲染-v-html、v-text
vue2.0 之文本渲染-v-html.v-text 1.index.html代码 <!DOCTYPE html> <html> <head> <meta c ...
- H5新特性之canvas
canvas无疑是H5之中最受欢迎的新特性了,它可以让浏览毫无费力的画出各种图案,动画. canvas的性能不会因为画布上的图案多少而改变,因此做动画用canvas性能也相当优秀. canvas最基本 ...
- P4147 玉蟾宫
P4147 玉蟾宫 给定一个 \(N * M\) 的矩阵 求最大的全为 \(F\) 的子矩阵 Solution 悬线法 限制条件为转移来的和现在的都为 \(F\) Code #include<i ...
- Java中Dom4j解析XML
与利用DOM.SAX.JAXP机制来解析xml相比DOM4J表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml.dom4j是一 ...
- CodeForces - 615D Multipliers(数论)
http://codeforces.com/problemset/problem/615/D 题意 给出m个质因子,组成一个数n.问n的约数的乘积是多少,输出mod 1e+7的结果. 分析 从输入我们 ...
- FastReport报表打印总页数的问题?
设置两次报表后加入引号内内容 "第[Page#]页 共[TotalPages#]页" 本站文章除注明转载外,均为本站原创或翻译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果 ...
- 淘淘商城之Ajax跨域请求
一.什么是跨域 (1)域名不同时: (2)域名相同,端口不同时 二.解决方法 可以使用jsonp解决跨域问题 三.什么是jsonp jsonp其实是一个跨域解决方案,js跨域请求数据是不允许的,但是跨 ...
- Hbase 集群安装(Hadoop 2.6.0 hbase0.99.2)
一:说明 该安装是在hadoop集群安装后进行,详情可见上一篇博客虚拟机centos7系统下安装hadoop ha和yarn ha(详细) .其中涉及五台机器,两台master(机器名:master, ...
- C语言入门教程-(6)运算符
1.运算符概述 运算符是一种编译器执行特定的数学或逻辑操作的符号.C语言提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 其他运算符 2.算术运算符 算术 ...