构造函数可以注入类吗?

时间:2018-10-15 04:16:03

标签: java spring aspectj spring-aop

假设我有一个基类(我正在简化):

public class GenericException extends Exception {
    private Map<String,Object> map;
    //...
    public GenericException(String message, String[] params, Object... values) {
        super(message);
        map = createMap(params, values);        
    }
    //... other stuff
    public String getType() {
        getClass().getName();
    }
}

此类可以由客户端扩展,但是没有必要将成员添加到其任何子类中,因为抛出该类及其子类时,将导致某些Json流式传输到某些客户端,仅包含地图,类型和消息

典型的子类可能类似于

public class Exception1 extends GenericException {
    private String message = "something";
    private String params = new String[] {"foo", "bar"};
    //...
    public Exception1(Object... values) {
        super(message, params, values);
    }
    //... other stuff
}

在代码的其他地方,需要采用任何GenericException(或其子类)的Json表示形式并创建该类的实例。 type属性可用于确定需要实例化哪个类,并且映射位于Json表示中,因此可以获取参数和值。 如果每个子类都可以被强制实现具有参数的构造函数

String message, String[] params, Object... values

那么这将很容易。 但是,每个子类虽然最终必须在GenericException中调用构造函数,但可能会有各种未知的构造函数。

我正在寻找一种魔术,它可以让我将这样的[虚拟]构造函数注入GenericException的每个子类中, 这样,需要从Json创建例外的代码 可以通过反射将其称为“虚拟”构造函数。

是否可以通过某种方式对类进行注释并进行一些Spring Aspect注释来创建此魔术? (在该项目中使用了Spring))

或者还有其他方法吗?

添加的其他信息2018年10月16日 感谢所有评论者。我想我需要添加更多信息:
1)我正在使用Spring Boot
2)我不想添加二传手。我认为例外应该是一成不变的。我们不要为此争论。
3)确保可以指示您必须在基类的每个扩展中实现一些其他构造函数。但我不想这样做。
4)我知道我需要使用AspectJ。但是,那是怎么做的呢?

所以这样想:人们正在编写GenericExceptions的子类,而我对他们的代码没有任何控制权。我拥有GenericException,并负责一些基础结构代码,这些代码应该重构类路径中但没有任何设置程序的GenericExceptions的任何子类。

0 个答案:

没有答案