您的位置:首页 > 移动开发 > Android开发

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

2017-03-31 11:46 573 查看
直接来看代码:

首先了解一下动态代理的关键词:

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android java 处理器