java 反射 报错_java反射调用方法报错?报错

扒一下 EvictInterceptor.java 自己做一个啦。

自己做一个 EvictInterceptor 的子类 MultiEvictInterceptor ,主要功能是 增强 原先父类的业务,支持自己定义的注解,并且也支持 原先 JFinal 的 CacheName 注解。

自己写一个注解 MultiCacheName :

package com.rocbin.demo;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface MultiCacheName {

String[] value();

}

拦截器和注解结合的桥梁就是通过 Java 反射,通过反射来获取 被调用的 Method(方法)的注解,然后进一步取得注解配置的信息,最后做一些基于配置的反应操作。

想要搞懂那就去看 EvictInterceptor.java ,估计里面都涉及到上面的知识点。

最后,建议一点点,反射 Method 最好能加一个 Cache:

ConcurrentHashMap MultiEvictCacheNameMap;

// KEY 存对于的 Method

// VALUE 是 对应注解上面的信息,下次取缓存,如命中则无需再次反射。

拦截器代码实现只是增强一下,支持自己的注解也支持 JFinal 的注解: 

package com.rocbin.demo;

public class MultiEvictInterceptor extends com.jfinal.plugin.ehcache.EvictInterceptor implements Interceptor {

final public void intercept(Invocation inv) {

inv.invoke();

String name = buildCacheName(inv);

String[] multiName = buildMultiCacheName(inv);

Set nameSet = new HashSet();

if(name!=null)

nameSet.add(name);

nameSet.addAll(Arrays.asList(multiName));

if (nameSet.isEmpty())

throw new RuntimeException("MultiEvictInterceptor need CacheName or MultiCacheName annotation in controller.");

for(String name: nameSet)

CacheKit.removeAll(name);

}

private String[] buildMultiCacheName(Invocation inv) {

MultiCacheName cacheName = inv.getMethod().getAnnotation(MultiCacheName.class);

if (cacheName != null)

return cacheName.value();

cacheName = inv.getController().getClass().getAnnotation(MultiCacheName.class);

return cacheName != null ? cacheName.value() : new String[]{};

}

private String buildCacheName(Invocation inv) {

CacheName cacheName = inv.getMethod().getAnnotation(CacheName.class);

if (cacheName != null)

return cacheName.value();

cacheName = inv.getController().getClass().getAnnotation(CacheName.class);

return cacheName != null ? cacheName.value() : null;

}

}

又是 业务注解,又是 @Before ,写多了就累赘,全局 拦截器 自动按 Method 注解 查找 注册的 拦截器 调用处理,更完美。@JFinal

建议扩展一下 EvictIntercpetor 用于支持这种形式: @CacheName("order_cache","order_cache")这种写法报错

扩展起来很容易,基本就是添加一个 cacheName.splite(",") 就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Feign进行远程调用时,有时会遇到.lang.reflect.InvocationTargetException异常。这个异常是由Java反射机制引起的,表示在调用方法时发生了异常。 java.lang.reflect.InvocationTargetException是一个包装异常,它将原始异常封装在内部。通常,我们需要查看InvocationTargetException的getCause()方法来获取实际的异常信息。 出现java.lang.reflect.InvocationTargetException异常的原因可能有很多,以下是一些常见的情况: 1. 远程服务不可用:如果远程服务没有启动或者无法访问,Feign调用就会失败,并抛出InvocationTargetException异常。 2. 请求参数错误:如果Feign调用的请求参数不正确,例如参数型不匹配或者缺少必要的参数,远程服务可能会抛出异常,并导致InvocationTargetException异常。 3. 远程服务异常:如果远程服务在处理请求时发生了异常,它可能会将异常信息返回给Feign客户端,并导致InvocationTargetException异常。 为了解决这个问题,我们可以通过以下步骤来排查: 1. 检查远程服务是否正常运行,并确保可以正常访问。 2. 检查Feign调用的请求参数是否正确,并与远程服务的接口定义进行对比。 3. 查看InvocationTargetException的getCause()方法返回的异常信息,以确定实际的异常原因。 4. 根据具体的异常原因采取相应的措施,例如修复远程服务的bug或者调整Feign调用的参数。 希望以上信息对您有帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值