首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cglib实现注释

使用cglib实现注释
EN

Stack Overflow用户
提问于 2015-01-27 15:22:21
回答 1查看 300关注 0票数 0

我刚接触cglib,但它似乎是适合这项工作的工具,所以这里是这样:

假设我有一个注释类FooBar,以及一个枚举类B,这样FooBar被声明如下:

代码语言:javascript
复制
public @interface Foo {
    public B value();
}

public @interface Bar {
    public B value();
}

现在,假设我有这个:

代码语言:javascript
复制
public class AnnotationImpl<A extends Annotation, B extends Enum<B>> {
    public AnnotationImpl(Class<A> annotationClass, B value);
    // value() returns value, annotationType() returns annotationClass
    // Implement equals(), hashCode(), toString() as specified
}

FooBar或多或少相同时,必须同时为它们创建AnnotationImpl子类似乎是重复的;是否可以使用cglib让方法makeImpl()接受一个注释类,该注释类返回实现该注释类的AnnotationImpl?例如:makeImpl(Foo.class, B.ONE)返回由AnnotationImpl(Foo.class, B.ONE)支持的Foo

EN

回答 1

Stack Overflow用户

发布于 2015-01-28 15:17:18

如果你只想返回值,用cglib实现一个注解是非常简单的。但是,如果您希望正确地实现hashCodeequalstoString方法,则需要稍微多做一些工作。

为此,您甚至不需要cglib,只需使用标准类库附带的JDK proxies即可。这将按如下方式工作:

代码语言:javascript
复制
<T> makeImpl(Class<T> type, Object value) {
  return Proxy.newProxyInstance(type.getClassLoader(),
                                new Class<?>[] { type },
                                new InvocationHandler() {
                                  @Override
                                  Object invoke(Object proxy, 
                                                Method method, 
                                                Object[] args) {
                                    // Fails when incompatible, e.g. hashCode method
                                    // or annotation with incompatible signature.
                                    return value;
                                  }
                                });
}

如果你想为注解实现一个通用的代理,看看my libary's AnnotationInvocationHandler,它实现了这样一个处理程序。(我的库Byte Buddy做的事情与cglib类似。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28165223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档