java注解使用问题? 400 报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

java注解使用问题? 400 报错

爱吃鱼的程序员 2020-06-01 11:09:12 37

java注解使用问题? 400 报错

先描述下问题吧:有些时候有些事情在可能会失败,这个时候就得去重试。写个简单的例子:

1. 注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {

    int times() default 1;

}


2. 任务类

public class Test {

    @Retry(times = 5)
    public void doJob(String job) {
        System.out.println(job);
    }

}



3. 处理类

public class RetryManager {

    public void doRetry(Class<?> objectClazz, String methodName, Object... args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        Object instance = objectClazz.getConstructor().newInstance();
        Class<?>[] fileTypeArray = new Class<?>[args.length];
        for (int i = 0; i < args.length; i++) {
            fileTypeArray[i] = args[i].getClass();
        }
        Method method = objectClazz.getMethod(methodName, fileTypeArray);
        int times = method.getAnnotation(Retry.class).times();
        while (times-- > 0) {
            try {
                method.invoke(instance, args);
                break;
            } catch (Exception e) {
                System.out.println("error happend, retry");
            }
        }
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        RetryManager manager = new RetryManager();
        manager.doRetry(Test.class, "doJob", "=== just eating ===");
    }
}



这里会用到第三个处理类,用得不是很爽的。

我想要的是直接调用任务类的背注解了的方法,然后就会执行上面处理类的方法,可以有办法实现么。







Java
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-01 11:29:10
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Retry {
    
        int times() default 1;
    
    }
    public interface ToDo {
    
        @Retry(times = 5)
        void doSomething(String thing);
    }



    public class Test implements ToDo {
    
        @Override
        public void doSomething(String thing) {
            System.out.println(thing);
            throw new RuntimeException();
        }
    
    }



    public class RetryProxy implements InvocationHandler {
    
    
        private Object object;
    
    
        @SuppressWarnings("unchecked")
        public <T> T getInstance(T t) {
            object = t;
            return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), this);
        }
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Class<?>[] fileTypeArray = new Class<?>[args.length];
            for (int i = 0; i < args.length; i++) {
                fileTypeArray[i] = args[i].getClass();
            }
            int times = method.getAnnotation(Retry.class).times();
            Object result = null;
            while (times-- > 0) {
                try {
                    result = method.invoke(object, args);
                    break;
                } catch (Exception e) {
                    System.out.println("error happend, retry");
                }
            }
            return result;
        }
    
    
        public static void main(String[] args) {
            ToDo toDo = new RetryProxy().getInstance(new Test());
            toDo.doSomething("== eat anything ==");
        }
    }
    




    ######首先得自己实现一个对象工厂 获得对象的时候判断  然后用cglib之类的字节码操作框架把处理代码插进去 然后返回处理后的对象######你的意思是说动态代理。 注解,跟代码元属性有关系的时候才用。
    ######spring的扫描咋做的?######………我没看过咋做的。我是只是类比回答,感觉能做。######现在各种不方便,没法看spring源码,等感冒好了再看,spring貌似也有个retry的包吧,spring batch?,总之先发上来做个伸手党吧######好吧,我最近看了下,就是动态代理的东西了,我这里因为没有接口所以可以选用cglib的动态代理来解决。######北京知名公司招聘java  有意向没######人在魔都######没有方法 只能全部扫描方法###### @木木三 不知道能不能从注解取到方法,因为拿到一个类的模板应该可以做任意的事的######回复 @IncRediblE : 貌似是理解不同,不过只有通过方法找到注解的,应该没有通过注解找到方法的######回复 @木木三 : 已经把代码写上,这个就是我想要的,可能我们理解的有些偏差######回复 @IncRediblE : 贴代码把,我觉得动态代理跟着没啥关系######动态代理,已解决问题,需要我放代码么?######

    没看懂2段代码在使用上有什么不同之处

    ###### @Maxwell1987 哦,是第一次弄错了,后来立马换了,估计服务器反应慢######回复 @IncRediblE : 是你换了图片还是昨天我看花眼了?昨天仔细看了几次两个main方法里面写的是一样的,才有此一问的。######功能当然一样,主要是看main方法里的调用,是用动态代理后有表面上的调用就很简洁了
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程