假设我有一个基类(我正在简化):
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的任何子类。