当同一个类有2个版本时,如何确保选择版本#1?

时间:2018-03-03 12:32:08

标签: java gson classloader

具体而言,我将gson的ObjectTypeAdapter类复制到我的项目中,并进行了以下更改(第78行):

        case NUMBER:
            return in.nextDoulbe();

        case NUMBER:
            String s = in.nextString();
            if(s.contains("."))
                return Double.valueOf(s);
            else
                return Long.valueOf(s);

现在这个类在gson-2.8.1.jar和my.jar中定义。

根据我的测试,这可以正常工作,my.jar中的那个被选中,而且数字现在并不总是被解析为double。

问题是如何确保我的版本始终被挑选?或者不可能?

1 个答案:

答案 0 :(得分:0)

在classpath上首先是规则。有几个类加载器已经可能会造成一些困难(如app server libraries)。但是在java 9中,你的技巧可能不再有用了。

所以请自定义TypeAdapter。

首先我尝试扩展,但由于ObjectTypeAdapter是最终类(感谢@Leon),on可以使用委托给ObjectTypeAdapter。

public class MyObjAdapter extends TypeAdapter<Object> { 
    private ObjectTypeAdapter delegate = new ObjectTypeAdapter();

    @Override public Object read(JsonReader in)
            throws IOException {
        JsonToken token = in.peek();
        switch (token) {
        case NUMBER:
            String s = in.nextString();
            return s.contains(".") || s.containsIgnoreCase("E")
                ? Double.valueOf(s)
                : Long.valueOf(s)   
        default:
          return delegate.read(in);
        }
    }        ...
}

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Object.class, new MyObjAdapter()); 
Gson gson = builder.create();