Proxy动态代理
Proxy动态代理
package com.test.dynamicproxy;
public interface Subject {
public void request();
}
package com.test.dynamicproxy;
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("request() from RealSubject");
}
}
package com.test.dynamicproxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class SubjectInvocationHandler implements InvocationHandler { private Object object; public SubjectInvocationHandler(Object obj) {
this.object = obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method.invoke(object,args);
return null;
} }
package com.test.dynamicproxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { RealSubject real = new RealSubject();
InvocationHandler ih = new SubjectInvocationHandler(real);
Class<?> clazz = real.getClass();
Subject s = (Subject)Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),ih); s.request(); //request() from RealSubject System.out.println(s.getClass().getName()); //$Proxy0
System.out.println(s instanceof Proxy); //true for(Class interf : s.getClass().getInterfaces()){
System.out.println(interf.getName()); //com.test.dynamicproxy.Subject
} // System.out.println(s.getClass().getPackage()); //null
// System.out.println(s.getClass().getSuperclass()); //class java.lang.reflect.Proxy
// System.out.println(Proxy.class.getPackage()); //package java.lang.reflect, Java Platform API Specification, version 1.6
} }
Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler. This method is equivalent to:
Proxy.getProxyClass(loader, interfaces).
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
Proxy.newProxyInstance throws IllegalArgumentException for the same reasons that Proxy.getProxyClass does.
- Parameters:
- loader the class loader to define the proxy class
- interfaces the list of interfaces for the proxy class to implement
- h the invocation handler to dispatch method invocations to
- Returns:
- a proxy instance with the specified invocation handler of a proxy class that is defined by the specified class loader and that implements the specified interfaces
- Throws:
- IllegalArgumentException - if any of the restrictions on the parameters that may be passed to
getProxyClassare violated - NullPointerException - if the
interfacesarray argument or any of its elements arenull, or
Client 中 s extends Proxy implements Subject
s.request() 方法调用流程 :
s 是 Subject 的 implementation .s.request() 的实现
s 伪代码:
s extends Proxy implements Subject{
InvocationHandler ih;
......
public void request(){
ih.invoke(....);
}
}
Proxy动态代理的更多相关文章
- Proxy 动态代理 InvocationHandler CGLIB MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 动态代理案例1:运用Proxy动态代理来增强方法
动态代理案例1: /*要求:运用Proxy动态代理来增强方法 题目: 1.定义接口Fruit,其中有addFruit方法 2.定义实现类FruitImpl,实现Fruit接口 3.定 ...
- JAVA的Proxy动态代理在自动化测试中的应用
JAVA的动态代理,在MYBATIS中应用的很广,其核心就是写一个interface,但不写实现类,然后用动态代理来实例化并执行这个interface中的方法,话不多说,来看一个实现的例子: 1.先定 ...
- 利用JDK的中Proxy动态代理实现Spring的AOP技术
首先给出设计模式静态代理与动态代理的学习: http://layznet.iteye.com/blog/1182924 讲的不错 然后我们实现AOP 就要求我们对委托的所有方法的调用实现拦截 代理 ...
- 【Java深入研究】5、Proxy动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Dynamic Proxy (动态代理模式)
动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口 动态代理角色: 1. 抽象主题角色 2. 真实主题角色(实现了抽象主题接口) 3. 动态代理主题角色(实 ...
- Proxy动态代理-增强方法
增强对象的功能 设计模式:一些通用的解决固定问题的方式 装饰器模式 代理模式 概念: 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模 ...
- Java进阶 | Proxy动态代理机制详解
一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...
- Java设计模式—Proxy动态代理模式
代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...
随机推荐
- 不通过AppStore,在iOS设备上直接安装应用程序的原理
本文转载至 http://mobile.51cto.com/hot-439095.htm 通过itms-services协议,可以通过safari浏览器直接在iOS设备上安装应用程序.利用这种方式, ...
- Docker学习(1安装docker)
1.在安装之前首先查看系统版本,ubuntu centos6 7 安装方式并不相同,所以首先确定系统版本 #cat /etc/issue 确定系统版本 2.开始安装Docker (1)Ubuntu下 ...
- Eclipse: Android Device Chooser - Unknown Target
公司最近所有的项目都使用到了Android开发手机(或PDA)应用.所需要的Android开发技术并不是非常复杂,因为我们的底层方法全部使用WebServcie写好了,做Android开发的人员只需要 ...
- iOS学习笔记(七)——UI基础UIButton
前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...
- CodeIgniter框架——源码分析之入口文件index.php
CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 在index.php中,CI首先做的事情就是设置PHP的错误报告, ...
- 回溯法——最大团问题(Maximum Clique Problem, MCP)
概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...
- Permutation Descent Counts(递推)
1968: Permutation Descent Counts Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb ...
- 160823、ionic上拉/下拉更新数据
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="UTF- ...
- 为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )
setlocale 配置地域化信息. 语法: string setlocale(string category, string locale); 返回值: 字符串 函数种类: 操作系统与环境 内容 ...
- HDU1950-Bridging signals-最长上升子序列
Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. ...