泛型,反射,访问自动生成的代码

时间:2017-07-15 18:08:05

标签: java generics reflection

我正在使用google的protobuf库为您自动生成代码。因此,如果您的PersonRequest对象有Person,它会为您生成类似于

的代码
PersonRequest.parseFrom(byte[] bytes)

因此,对于我的每个请求,我都有一些看起来像

的代码
XXXXXRequest.paseFrom(byte[] bytes)

我想要做的是写一个像

这样的界面
public interface MyInterface<T> {
    T parseFrom(byte[] bytes)
}

之后,我不确定在实施中该做什么。是否像

一样
public class MyInterfaceImpl<T> implements MyInterface<T> {
    @Override
    T parseFrom(byte[] bytes) {
         return T.parseFrom(bytes);   //  what do I do here?
    }
}

我不确定是否可以通过反射或我应该在这里做什么来获取对象的方法?

2 个答案:

答案 0 :(得分:0)

您可以直接引用解析器方法,而不是为您的接口创建单独的实现,并使用它来创建接口的实例:

MyInterface<PersonRequest> obj = PersonRequest::parseFrom;

答案 1 :(得分:0)

每个生成的类(PersonRequest,OtherClassRequest等等)都是特定的类 因此,您应该按特定的生成类定义实现。

在这些条件下,不需要为接口和子类声明泛型:

public class MyInterfaceImpl<T> implements MyInterface<T> {

您只需要MyInterface界面的通用 你宣布它的方式还可以。

然后,它的子类应指定它们实现的父类的泛型类型。

例如:

public class MyPersonRequestImpl implements MyInterface<PersonRequest> {
    @Override
    PersonRequest parseFrom(byte[] bytes) {
         return PersonRequest.parseFrom(bytes);
    }
}