码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理1

时间:2016-05-02 21:08:11      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

动态代理

1. 只学一个方法:

Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

 方法的作用:在运行时,动态创建一组指定的接口的实现类对象!(在运行时,创建实现了指定的一组接口的对象)

interface A {

}

interface B {

}

Object o = 方法(new Class[]{A.class,B.class})

o它实现了A和B两个接口!

?

Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

1. 方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象!

三大参数介绍:

1. ClassLoader:类加载器!

* 它是用来加载器的,把.class文件加载到内存,形成Class对象!

2. Class[] interfaces:指定要实现的接口们

3. InvocationHandler:被代理的对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。

说明:也就是说,实现动态代理需要三大参数。

2. 动态代理作用

最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!

InvocationHandler

public Object invoke(Object proxy, Method method, Object[] args);

?

这个invoke()方法在什么时候被调用!

1. 在代理对象被创建时?错误的!

2. 在调用代理对象所实现接口中的方法时?正确的!

?

* Object proxy:当前对象,即被代理的对象!在调用谁的方法!

* Method method:当前被调用的方法(目标对象的方法)

* Object[] args:实参!

他们之间的对应关系:

技术分享

目标对象:被增强的对象

代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!

目标方法:增强的内容

代理对象 = 目标对象 + 增强

?

实例:使用 三大参数来创建 代理对象:Dome1.java

/**

* @function 使用三大参数来创建代理对象

* @author not-bug

*

*/

public class Demo1 {

????@Test

????public void fun1() {

????????/*

???????? * 三大参数

???????? * 1. ClassLoader

???????? * 方法需要动态生成一个类,这个类实现了AB接口,然后创建这个类的对象!

???????? * 需要生成一个类,这个类也需要加载到方法区中,谁来加载,当然是ClassLoader!!!

???????? *

???????? * 2. Class[] interfaces

???????? * 它是要实现的接口们,也就是说,你需要实现的接口

???????? *

???????? * 3. InvocationHandler

???????? * 它是调用处理器

???????? * 敷衍它!

???????? *

???????? * 代理对象中实现所有接口中的方法,内容都是调用InvocationHandlerinvoke()方法。

???????? */

????????ClassLoader loader = this.getClass().getClassLoader();

????????InvocationHandler h = new InvocationHandler() {

????????????public Object invoke(Object proxy, Method method, Object[] args)

????????????????????throws Throwable {

????????????????System.out.println("你好,动态代理!");

????????????????return "xxx";

????????????}

????????};

????????// 使用三大参数创建代理对象!!!

????????Object o = Proxy.newProxyInstance(loader, new Class[]{A.class, B.class}, h);

????????

????????// 强转成AB类型,成功了!

????????A a = (A) o;

????????B b = (B) o;

????????

//????????a.a();

//????????a.aa();

//????????b.b();

//????????b.bb();

????????

//????????System.out.println(o.getClass().getName());

????????//调用被代理对象所实现的接口方法,其实是在调用InvocationHandlerinvoke()方法。

????????Object result = a.aaa("hello", 100);

????????System.out.println(result);

????}

}

?

interface A {

????public void a();

????public void aa();

????public Object aaa(String s, int i);

}

?

interface B {

????public void b();

????public void bb();

}

?

该实例运行结果:技术分享

动态代理1

标签:

原文地址:http://www.cnblogs.com/Prozhu/p/5452926.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!