Android注解学习之了解Java动态代理Proxy

  1. 直接来看代码:
    首先了解一下动态代理的关键词:

InvocationHandler:

1.java.lang.reflect.InvocationHandler:
这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。
2. InvocationHandler 的核心方法
第一个参数既是代理类实例,
第二个参数是被调用的方法对象
第三个方法是调用参数。
调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行
Object invoke(Object proxy, Method method, Object[] args)   

Proxy:

1.java.lang.reflect.Proxy:
这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
2.. Proxy 的静态方法
// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
static InvocationHandler getInvocationHandler(Object proxy) 

// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
static Class getProxyClass(ClassLoader loader, Class[] interfaces) 

// 方法 3:该方法用于判断指定类对象是否是一个动态代理类
static boolean isProxyClass(Class cl) 

// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, 
    InvocationHandler h)
package com.example.xzw.jpushtestdemo.view;

import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * 实现InvocationHandler接口的调用处理器类,这是个固定的代码;
 * Created by xzw on 2017/3/30.
 */

public class DynamicHandler implements InvocationHandler {

    private WeakReference<Object> handlerRef;
    private final HashMap<String, Method> hashMap = new HashMap<>(1);

//通过构造方式,获取委托类,并用弱应用保存;
    public DynamicHandler(Object handler) {
        this.handlerRef = new WeakReference<Object>(handler);
    }

    public void addMethod(String name, Method method) {
        hashMap.put(name, method);
    }

    public Object getHandler() {
        return handlerRef.get();
    }

    public void setHandler(Object handlerRef) {
        this.handlerRef = new WeakReference<Object>(handlerRef);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //从弱应用中获取委托类
        Object object = handlerRef.get();
        if (object != null) {
        //根据代理类的方法method,获取方法名methodName
            String methodName = method.getName();
            //根据方法名methodName在hashMap集合中获取注解方法method;
            method = hashMap.get(methodName);
            if (method != null) {
            //利用反射,委托类调用method方法,参数为args
                    return method.invoke(object, args);
            }
        }
        return null;
    }
}

详细学习动态代理请看博客:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值