zoukankan      html  css  js  c++  java
  • 执行接口默认方法

    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;
    }
    }

  • 相关阅读:
    sql server 修改/查看 主键初始值
    国内外邮箱正则验证及js示例
    修改表中主键 标识/初始值
    主角场景Shader效果:遮挡透明
    主角场景效果:人物阴影
    主角场景Shader效果:描边
    主角场景Shader效果:光影
    Unity ZTest深度测试 & ZWrite深度写入
    天气系统:雨、雪
    UnityShader 序列帧动画效果
  • 原文地址:https://www.cnblogs.com/sidesky/p/10552335.html
Copyright © 2011-2022 走看看