All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alicp.jetcache.anno.method.ProxyUtil Maven / Gradle / Ivy

The newest version!
/**
 * Created on  13-09-20 21:36
 */
package com.alicp.jetcache.anno.method;

import com.alicp.jetcache.CacheManager;
import com.alicp.jetcache.anno.support.ConfigMap;
import com.alicp.jetcache.anno.support.ConfigProvider;

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

/**
 * @author huangli
 */
public class ProxyUtil {

    public static  T getProxyByAnnotation(T target, ConfigProvider configProvider, CacheManager cacheManager) {
        final ConfigMap configMap = new ConfigMap();
        processType(configMap, target.getClass());
        Class[] its = ClassUtil.getAllInterfaces(target);
        CacheHandler h = new CacheHandler(target, configMap,
                () -> configProvider.newContext(cacheManager).createCacheInvokeContext(configMap),
                configProvider.getGlobalCacheConfig().getHiddenPackages());
        Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), its, h);
        return (T) o;
    }

    private static void processType(ConfigMap configMap, Class clazz) {
        if (clazz.isAnnotation() || clazz.isArray() || clazz.isEnum() || clazz.isPrimitive()) {
            throw new IllegalArgumentException(clazz.getName());
        }
        if (clazz.getName().startsWith("java")) {
            return;
        }
        Method[] methods = clazz.getDeclaredMethods();
        for (Method m : methods) {
            if (Modifier.isPublic(m.getModifiers())) {
                processMethod(configMap, m);
            }
        }

        Class[] interfaces = clazz.getInterfaces();
        for (Class it : interfaces) {
            processType(configMap, it);
        }

        if (!clazz.isInterface()) {
            if (clazz.getSuperclass() != null) {
                processType(configMap, clazz.getSuperclass());
            }
        }
    }

    private static void processMethod(ConfigMap configMap, Method m) {
        String sig = ClassUtil.getMethodSig(m);
        CacheInvokeConfig cac = configMap.getByMethodInfo(sig);
        if (cac == null) {
            cac = new CacheInvokeConfig();
            if (CacheConfigUtil.parse(cac, m)) {
                configMap.putByMethodInfo(sig, cac);
            }
        } else {
            CacheConfigUtil.parse(cac, m);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy