• 执行接口默认方法


    public class YafBeanManager implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
    }

    public Object invokeMethod(YafMethod yafMethod, Object[] args, Method method) throws Throwable {
    if (yafMethod != null) {
    Object bean = applicationContext.getBean(yafMethod.getClazz());
    Method yafM = yafMethod.getMethod();
    Object returnObj = yafM.invoke(bean, args);
    return returnObj;
    }

    // 没有提供扩展, 执行扩展点的默认实现
    if (method.isDefault()) {
    Object bean = applicationContext.getBean("save");
    Class<?> interfaceCls = method.getDeclaringClass();
    Object target = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
    new Class[]{interfaceCls},
    (proxy, m, arguments) -> {
    m.setAccessible(true);
    return m.invoke(bean, arguments);
    }
    );


    MethodHandles.Lookup lookup = MethodHandles.lookup().in(target.getClass());

    // 修改 lookup 实例中的 allowedModes, 否则会抛异常导致调不了 default 方法
    Field field = lookup.getClass().getDeclaredField("allowedModes");
    field.setAccessible(true);

    // 改掉这个字段的 final
    Field modifierField = Field.class.getDeclaredField("modifiers");
    modifierField.setAccessible(true);
    modifierField.set(field, field.getModifiers() ^ Modifier.FINAL);

    // 设置allowedModes
    field.set(lookup, -1);

    return lookup.unreflectSpecial(method, interfaceCls)
    .bindTo(target)
    .invokeWithArguments(args);
    }

    return null;
    }
    }

  • 相关阅读:
    centos 用户指定目录访问
    centos FTP 用户指定目录禁用上级目录
    centos下SVN搭建多个库文件总汇
    listview点击checkbox,修改值
    C#转成时间格式
    nmap 查看主机上开放的端口
    xargs、管道、exec区别
    OSI七层模型,作用及其对应的协议
    linux面试题(重点)
    数据库备份还原 mysqldump
  • 原文地址:https://www.cnblogs.com/sidesky/p/10552335.html
Copyright © 2020-2023  润新知