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

类的加载机制和反射——五、使用反射生成JDK动态代理

时间:2017-06-29 10:04:42      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:eth   oid   font   val   cat   aop   nbsp   obj   他也   

使用反射生成JDK动态代理

1.使用Proxy和InvocationHandler创建动态代理

(1)Proxy提供了用于创建动态代理类和动态代理对象的静态方法,他也是所有动态代理类的父类。

(2)如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,如果需要为一个或多个接口动态的创建实例,也可以使用Proxy来创建动态代理实例。

(3)Proxy提供了两个方法来创建动态代理类和动态实例:

  1)static Class<?> getProxyClass(ClassLoader loader,Class<?>...interface):

    创建一个动态代理类所对应的Class对象,该代理类将实现interface所指定的多个接口。第一个               ClassLoader参数指定生成动态代理类的类加载器;

  2)static Object newProxyInstance(ClassLoader laoder,Class<?>[] interface,InvocationHandler h):

    直接创建一个动态代理对象,该代理对象的实现类实现了interface指定的系列接口,执行代理对象的每个         方法时都会被替换执行InvocationHandlerd对象的invoke方法;

(4)使用Proxy和InvocationHandler生成动态代理对象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//定义一个接口
interface Person{
    void walk();
    void sayHello(String name);
}
//实现InvocationHandler接口的类
class MyInvocationHandler implements InvocationHandler{
    /*
     * 执行动态代理的所有方法时,都会被替换成如下的invoke方法
     * proxy——动态代理对象
     * method——正在执行的方法
     * args——调用目标方法时所传入的参数
     */
    //InvocationHandler中所需实现的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("正在执行的方法:"+method);
        if(args!=null){
            System.out.println("下面是执行该方法时传入的参数:");
            for(Object val:args){
                System.out.println(val);
            }
        }else{
            System.out.println("调用该方法没有实参!");
        }
        return null;
    }
    
}
public class ProxyTest {
    public static void main(String[] args)throws Exception{
        //创建一个InvocationHandler对象
        InvocationHandler handler = new MyInvocationHandler();
        //使用指定的InvocationHandler来生成一个动态代理对象
        Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler);
        //调用动态代理对象的方法
        p.walk();
        p.sayHello("aaa");
    }
}

 

2.动态代理和AOP

  用于方便代码的复用以及后期修改(暂时想到的)。

 

类的加载机制和反射——五、使用反射生成JDK动态代理

标签:eth   oid   font   val   cat   aop   nbsp   obj   他也   

原文地址:http://www.cnblogs.com/ljiwej/p/7092459.html

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