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