com.gitee.l0km.aocache.Singleton Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aocache Show documentation
Show all versions of aocache Show documentation
call/execution caching utility based on aspectj
package com.gitee.l0km.aocache;
import static com.gitee.l0km.aocache.AocacheUtils.invokeConstructor;
import static com.gitee.l0km.aocache.AocacheUtils.nonnullTypesOf;
import static com.gitee.l0km.aocache.AocacheUtils.EMPTY_CLASS_PARAMETERS;
import static com.gitee.l0km.aocache.guava.base.Preconditions.checkArgument;
import com.gitee.l0km.aocache.annotations.AoCacheable;
import com.gitee.l0km.aocache.annotations.AoWeakCacheable;
import com.gitee.l0km.aocache.guava.base.Throwables;
/**
* 单实例缓存支持
* @author guyadong
*
*/
public class Singleton {
/**
* 反射创建实例缓存
* @param
* @param clazz
* @param parameterTypes 构造方法参数类型数组
* @param args 构造方法参数对象数组
*/
private T newInstance(Classclazz,Class>[] parameterTypes, Object[]args) {
try {
parameterTypes = null==parameterTypes
? nonnullTypesOf(args)
: nonnullTypesOf(parameterTypes);
args = (args == null) ? EMPTY_CLASS_PARAMETERS : args;
checkArgument(parameterTypes.length == args.length,"MISMATCH parameterTypes.length and args.length");
return (T) invokeConstructor(clazz,args, parameterTypes);
} catch (Exception e) {
Throwables.throwIfUnchecked(e);
throw new RuntimeException(e);
}
}
/**
* 参见 {@link #newInstance(Class, Class[], Object[])},
* {@code args}数组不允许有{@code null}元素,
* 否则会因为无法获取参数类型抛出异常
*/
private T newInstance(Classclazz,Object[] args) {
return newInstance(clazz,null,args);
}
/**
* 返回全局单实例(弱引用)
* 弱引用存储的实例在没有被引用时会被JVM自动回收,下次调用自动创建新实例
* @param 实例类型变量
* @param clazz 实例类型
* @param parameterTypes 构造方法参数类型数组
* @param args 构造方法参数对象数组
*/
@AoWeakCacheable
public T weakSingletonOf(Classclazz,Class>[] parameterTypes,Object[]args) {
return newInstance(clazz,parameterTypes,args);
}
/**
* 返回全局单实例(弱引用)
* 弱引用存储的实例在没有被引用时会被JVM自动回收,下次调用自动创建新实例
* @param 实例类型变量
* @param clazz 实例类型
* @param args 构造方法参数,不允许有{@code null}元素,否则会因为无法获取参数类型抛出异常
*/
@AoWeakCacheable
public T weakSingletonOf(Classclazz,Object...args) {
return newInstance(clazz,args);
}
/**
* 返回全局单实例
* 运行时对给定输入参数返回同一实例
* @param 实例类型变量
* @param clazz 实例类型
* @param parameterTypes 构造方法参数类型数组
* @param args 构造方法参数对象数组
*/
@AoCacheable
public T singletonOf(Classclazz,Class>[] parameterTypes,Object[]args) {
return newInstance(clazz, parameterTypes, args);
}
/**
* 返回全局单实例
* 运行时对给定输入参数返回同一实例
* @param 实例类型变量
* @param clazz 实例类型
* @param args 构造方法参数,不允许有{@code null}元素,否则会因为无法获取参数类型抛出异常
*/
@AoCacheable
public T singletonOf(Classclazz,Object...args) {
return newInstance(clazz, args);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy