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
} }
Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

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 getProxyClass are violated
NullPointerException - if the interfaces array argument or any of its elements are null, 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动态代理的更多相关文章

  1. Proxy 动态代理 InvocationHandler CGLIB MD

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

  2. 动态代理案例1:运用Proxy动态代理来增强方法

    动态代理案例1: /*要求:运用Proxy动态代理来增强方法 题目:    1.定义接口Fruit,其中有addFruit方法    2.定义实现类FruitImpl,实现Fruit接口    3.定 ...

  3. JAVA的Proxy动态代理在自动化测试中的应用

    JAVA的动态代理,在MYBATIS中应用的很广,其核心就是写一个interface,但不写实现类,然后用动态代理来实例化并执行这个interface中的方法,话不多说,来看一个实现的例子: 1.先定 ...

  4. 利用JDK的中Proxy动态代理实现Spring的AOP技术

    首先给出设计模式静态代理与动态代理的学习: http://layznet.iteye.com/blog/1182924   讲的不错 然后我们实现AOP 就要求我们对委托的所有方法的调用实现拦截 代理 ...

  5. 【Java深入研究】5、Proxy动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  6. Dynamic Proxy (动态代理模式)

    动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口 动态代理角色: 1. 抽象主题角色 2. 真实主题角色(实现了抽象主题接口) 3. 动态代理主题角色(实 ...

  7. Proxy动态代理-增强方法

    增强对象的功能 设计模式:一些通用的解决固定问题的方式 装饰器模式 代理模式 概念: 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模 ...

  8. Java进阶 | Proxy动态代理机制详解

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...

  9. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

随机推荐

  1. Digit Division

    Digit Division Time limit: 1 s Memory limit: 512 MiB We are given a sequence of n decimal digits. Th ...

  2. C#访问修饰符比较

  3. js对多行字符串的处理

    f = [] g = str(f) h = ''.join(f) dic_ = () gd = str(dic_) hd = ''.join(dic_) 0 老板1 北京2 上海3 天津4 重庆5 河 ...

  4. _ 下划线 Underscores __init__

    Underscores in Python https://shahriar.svbtle.com/underscores-in-python Underscores in Python This p ...

  5. 基础篇-java开发

    开局必知 1.变量 在java中,以{}为作用域,所以就存在成员变量和局部变量之说 由于java是强类型语言,所以在申明变量的时候,必须指定类型 java里,一个变量有声明过程和初始化过程(也就是赋值 ...

  6. Python操作Redis(一)

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  7. C# 函数2

    //读写INI     public class GF_INI     {         [DllImport("kernel32")]         private stat ...

  8. Django:popup弹出框简单应用实例

    效果:在p1.html页面点击,弹出p2的弹出框,填写数据,在 popup_response页面处理数据 1.url设置 urlpatterns = patterns( url(r'^p1.html' ...

  9. SQL SERVER 2005 Express版, 精简版 下载

      Microsoft SQL Server 2005 Express Edition(数据库) https://www.microsoft.com/zh-CN/download/details.as ...

  10. LeetCode:矩阵置零【73】

    LeetCode:矩阵置零[73] 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   ...