什么是动态代理


import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;


/**
 * 代理模式至少需要实现两个类,一个代理类,一个被代理类(都要实现共有接口)。
 * 动态代理之所以称为动态,是因为代理类在运行时由Proxy类产生,
 * 这就大大减少了需要我们手工设计代理类的数量。
 *在实际应用中,Proxy通过类装载器和需要实现的接口来产生代理类,
 *即Proxy.getProxyClass(ClassLoader, Class[]),返回为代理类的Class实例。
 *一般而言,该方法由InvocationHandler的实现类中的方法来调用,
 *可以取这样的名字:getProxyObject,该方法使用Proxy.getProxyClass后
 *(此时两个入口参数可以用realObject.getClass.getClassLoader()
 *以及realObject.getClass.getInterfaces()两个方法得到,
 *realObject指被代理类实例,一般由InvocationHandler的实现类的构造函数注入),
 *进一步使用Class中的getConstructor(new Class[] { InvocationHandler.class}).newInstance(new Object[] { this })
 *来得到代理类的实例(或者合并这两个方法,
 *用Proxy.newProxyInstance(realObject.getClass.getClassLoader(), realObject.getClass.getInterfaces(),this)方法)
 *。但是必须注意代理类的实现是由Proxy完成,与InvocationHander的实现类毫无关系,
 *InvocationHander的实现类只是通过代理类的构造函数注入后实现了对代理类中方法调用的拦截。
 *InvocationHander的实现类需要保留一个指向被代理类的引用(或称句柄、指针),
 *该被代理类一般通过InvocationHandler的实现类的构造函数注入,也可以用set方法,
 *一般可以取为realObject。则在InvocationHandler接口的invoke方法中,
 *对于realObject中相应方法的直接调用是用method.invoke(realObjet, args )实现的,
 *其中method和args直接由invoke方法中的输入参数给出。
 *
 *好了先让我们俩了解什么是代理
 */

//AOP面向切面的编程
public class BeanFactory {
    //动态代理入门
    public static void main(String[] args) throws Exception {
        //首先我们先让JVM生成一个代理类
        Class clazzProsy = Proxy.getProxyClass(Collection.class
                .getClassLoader(), Collection.class);
        System.out.println(clazzProsy.getName());

        System.out.println("-----Begin constructor-----");
        //得到代理类上的构造函数
        Constructor[] constructors = clazzProsy.getConstructors();
        for (Constructor constructor : constructors) {
            String name = constructor.getName();
            // 单线程下StringBuilder效率比较高
            // 多线程时StringBuffer效率比较高
            StringBuilder strB = new StringBuilder(name);
            strB.append('(');
            Class[] clazzParams = constructor.getParameterTypes();
            for (Class clazzParam : clazzParams) {
                strB.append(clazzParam.getName()).append(',');
            }
            if (clazzParams.length != 0 && clazzParams != null)
                strB.deleteCharAt(strB.length() - 1);
            strB.append(')');
            System.out.println(strB.toString());
        }

        System.out.println("-----Begin methods-----");
        //得到代理类上的所有方法
        Method[] methods = clazzProsy.getMethods();
        for (Method method : methods) {
            String name = method.getName();
            // 单线程下StringBuilder效率比较高
            // 多线程时StringBuffer效率比较高
            StringBuilder strB = new StringBuilder(name);
            strB.append('(');
            Class[] clazzParams = method.getParameterTypes();
            for (Class clazzParam : clazzParams) {
                strB.append(clazzParam.getName()).append(',');
            }
            if (clazzParams.length != 0 && clazzParams != null)
                strB.deleteCharAt(strB.length() - 1);
            strB.append(')');
            System.out.println(strB.toString());
        }
       
       
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值