当前位置: 首页 > 面试题库 >

Java注解,用于包装方法

甄越
2023-03-14
问题内容

我有很多基本上遵循此模式的样板代码:

function doSomething() {
  try {
    [implementation]
    [implementation]
    [implementation]
    [implementation]
  } catch (Exception e) {
    MyEnv.getLogger().log(e);
  } finally {
    genericCleanUpMethod();
  }
}

我很想创建自己的注释来清理代码:

@TryCatchWithLoggingAndCleanUp
function doSomething() {
  [implementation]
  [implementation]
  [implementation]
  [implementation]
}

方法签名差异很大(取决于方法的实际实现),但是样板try / catch / finally部分始终相同。

我想到的注释会自动将注释方法的内容与整个try...catch...finallyhoopla 包装在一起。

我一直在寻找一个简单的方法来进行此操作,但是什么也没发现。我不知道,也许我只是看不到所有带注释的树木的树林。

我将如何实现这种注释的任何指针将不胜感激。


问题答案:

为此,您将需要一些AOP框架,该框架将在您的方法周围使用代理。该代理将捕获异常并执行finally块。坦率地说,如果您还没有使用支持AOP的框架,我不确定我是否会只使用它来保存这几行od代码。

但是,您可以使用以下模式以更优雅的方式执行此操作:

public void doSomething() {
    logAndCleanup(new Callable<Void>() {
        public Void call() throws Exception {
            implementationOfDoSomething();
            return null;
        }
    });
}

private void logAndCleanup(Callable<Void> callable) {
    try {
        callable.call();
    } 
    catch (Exception e) {
        MyEnv.getLogger().log(e);
    } 
    finally {
        genericCleanUpMethod();
    }
}

我只是用作Callable<Void>接口,但是您可以定义自己的Command接口:

public interface Command {
    public void execute() throws Exception;
}

因此避免了使用泛型Callable<Void>并从Callable返回null 的需要。

编辑:如果您想从您的方法返回一些东西,然后使该logAndCleanup()方法通用。这是一个完整的示例

public class ExceptionHandling {
    public String doSomething(final boolean throwException) {
        return logAndCleanup(new Callable<String>() {
            public String call() throws Exception {
                if (throwException) {
                    throw new Exception("you asked for it");
                }
                return "hello";
            }
        });
    }

    public Integer doSomethingElse() {
        return logAndCleanup(new Callable<Integer>() {
            public Integer call() throws Exception {
                return 42;
            }
        });
    }

    private <T> T logAndCleanup(Callable<T> callable) {
        try {
            return callable.call();
        }
        catch (Exception e) {
            System.out.println("An exception has been thrown: " + e);
            throw new RuntimeException(e); // or return null, or whatever you want
        }
        finally {
            System.out.println("doing some cleanup...");
        }
    }

    public static void main(String[] args) {
        ExceptionHandling eh = new ExceptionHandling();

        System.out.println(eh.doSomething(false));
        System.out.println(eh.doSomethingElse());
        System.out.println(eh.doSomething(true));
    }
}

编辑:和与Java 8,包装的代码可以有点漂亮:

public String doSomething(final boolean throwException) {
    return logAndCleanup(() -> {                
        if (throwException) {
            throw new Exception("you asked for it");
        }
        return "hello";                
    });
}


 类似资料:
  • 主要内容:1. 引入依赖,2. 开启组件扫描,3. 使用注解定义 Bean,4. 基于注解方式实现依赖注入,示例从 Java 5 开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。 Spring 从 2.5 版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化 Spring 的 XML 配置。 Spring 通过注解

  • 要使用 @Autowired,需要注册 AutowiredAnnotationBeanPostProcessor,可以有以下两种方式来实现: 引入配置文件中的<bean>下引入 <context:annotation-config> <beans> <context:annotation-config /> </beans> 在bean配置文件中直接引入AutowiredAnnotatio

  • 我最近从使用Spring的XML配置切换到Java配置,遇到了一个奇怪的问题。 XML配置为: 有什么想法吗?

  • 本文向大家介绍Python第三方包PrettyTable安装及用法解析,包括了Python第三方包PrettyTable安装及用法解析的使用技巧和注意事项,需要的朋友参考一下 可以让我们将数据用表格的方式展示出来 安装方式 pip install PrettyTable 测试是否安装成功 使用方法与对比增加一条数据 先简单的看下如何使用以及效果 效果 增加一个字段 效果 常用的几个方法 以上就是本

  • 本文向大家介绍java基于spring注解AOP的异常处理的方法,包括了java基于spring注解AOP的异常处理的方法的使用技巧和注意事项,需要的朋友参考一下 一、前言 项目刚刚开发的时候,并没有做好充足的准备。开发到一定程度的时候才会想到还有一些问题没有解决。就比如今天我要说的一个问题:异常的处理。写程序的时候一般都会通过try...catch...finally对异常进行处理,但是我们真的

  • 如果在方法调用中忽略了一个异常,我们可以这样写: 我正在尝试编写一个自定义的注释,它具有相同的效果,但可以只应用于方法头。这可能看起来类似于以下内容: 如何创建这样的注释?