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

com.jfinal.ext.proxy.CglibProxyFactory Maven / Gradle / Ivy

/**
 * Copyright (c) 2011-2019, James Zhan 詹波 ([email protected]).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.ext.proxy;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import com.jfinal.aop.Interceptor;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.SyncWriteMap;
import com.jfinal.proxy.ProxyFactory;

/**
 * CglibProxyFactory 用于扩展 cglib 的代理模式,默认不使用
 * 
 * 
 * 配置方法:
 * public void configConstant(Constants me) {
 *     ProxyManager.me().setProxyFactory(new CglibProxyFactory());
 * }
 * 
*/ public class CglibProxyFactory extends ProxyFactory { @SuppressWarnings("unchecked") public T get(Class target) { return (T)net.sf.cglib.proxy.Enhancer.create(target, new CglibCallback()); } static class IntersCache { private static final Map cache = new SyncWriteMap<>(2048, 0.25F); public static void put(MethodKey methodKey, Interceptor[] inters) { Objects.requireNonNull(methodKey, "methodKey can not be null"); Objects.requireNonNull(inters, "inters can not be null"); cache.putIfAbsent(methodKey, inters); } public static Interceptor[] get(MethodKey methodKey) { return cache.get(methodKey); } public static MethodKey getMethodKey(Class target, Method method) { long paraHash = HashKit.FNV_OFFSET_BASIS_64; Class[] paraTypes = method.getParameterTypes(); for (Class pt : paraTypes) { paraHash ^= pt.getName().hashCode(); paraHash *= HashKit.FNV_PRIME_64; } return new MethodKey(target.getName().hashCode(), method.getName().hashCode(), paraHash); } } static class MethodKey { final int classHash; final int methodHash; final long paraHash; MethodKey(int classHash, int methodHash, long paraHash) { this.classHash = classHash; this.methodHash = methodHash; this.paraHash = paraHash; } public int hashCode() { return classHash ^ methodHash ^ ((int)paraHash); } /** * 通过比较三部分 hash 值,避免超大规模场景下可能的 key 值碰撞 * * 不必判断 if (methodKey instanceof MethodKey),因为所有 key 类型必须要相同 * 不必判断 if (this == methodKey),因为每次用于取值的 methodKey 都是新建的 */ public boolean equals(Object methodKey) { MethodKey mk = (MethodKey)methodKey; return classHash == mk.classHash && methodHash == mk.methodHash && paraHash == mk.paraHash; } public String toString() { return "classHash = " + classHash + "\nmethodHash = " + methodHash + "\nparaHash = " + paraHash; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy