public class ProxyGenerator {
protected boolean isSkipMethod(Method method) {
int mod = method.getModifiers();
if ( ! Modifier.isPublic(mod) ) {
return true;
}
if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isAbstract(mod)) {
return true;
}
/*
* 当子类重写父类方法时,应只增强子类方法。
* 若都不做处理,则会都增强,导致出现异常:
* 名称冲突: class UserService$$Enhancer 的两种方法具有相同的疑符, 但两者均不覆盖对方
* public boolean deleteById(java.lang.String p0) {
* ^
* 第一种方法: top.xpman.service.impl.BaseService 中的 deleteById(java.lang.String)
* 第二种方法: top.xpman.service.UserService$$Enhancer 中的 deleteById(java.lang.Object)
*
* 示例代码:
* class BaseService<T extends Model<T>, ID> {
* public T findById(ID id) {
* // default process
* }
* }
*
* class UserService extends BaseService<User, String> {
* @Override
* @Before(CacheInterceptor.class)
* public User findById(String id) {
* // process
* }
* }
*
* 运行时获取到类的方法:
* @Before(CacheInterceptor.class)
* public Model findById(Object id);
* // 4196 = 1(public) & 64(0x0040: volatile) & 4096(0x1000: synthetic)
* modifiers: 4161
* ......
*
* @Before(CacheInterceptor.class)
* public User findById(String id);
* // 1: public
* modifiers: 1
* ......
*
* Modifier.isSynthetic() => modifiers & 4096 != 0
*
* 由于时间关系并未深究与测试,这里简单粗暴处理一下,
* 此处应该校验一下是否有签名一致的方法才对
* todo 2023/03/04
*/
final int modifiers = 4096;
if ((modifiers & mod) != 0) {
log.debug("Skip Synthetic Method: {}", method);
return true;
}
String n = method.getName();
if (n.equals("toString") || n.equals("hashCode") || n.equals("equals")) {
return true;
}
return false;
}
}
项目:JFinal
me.setToJavassistProxyFactory();
新框架 aifei 已经将默认代理切到 javassist 了,原先的动态编译不再使用,主要原因还是动态编译依赖 JDK,而有些 docker 服务端生产环境可能安装的是 JRE