我刚接触cglib,但它似乎是适合这项工作的工具,所以这里是这样:
假设我有一个注释类Foo和Bar,以及一个枚举类B,这样Foo和Bar被声明如下:
public @interface Foo {
public B value();
}
public @interface Bar {
public B value();
}现在,假设我有这个:
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
}当Foo和Bar或多或少相同时,必须同时为它们创建AnnotationImpl子类似乎是重复的;是否可以使用cglib让方法makeImpl()接受一个注释类,该注释类返回实现该注释类的AnnotationImpl?例如:makeImpl(Foo.class, B.ONE)返回由AnnotationImpl(Foo.class, B.ONE)支持的Foo
发布于 2015-01-28 15:17:18
如果你只想返回值,用cglib实现一个注解是非常简单的。但是,如果您希望正确地实现hashCode、equals和toString方法,则需要稍微多做一些工作。
为此,您甚至不需要cglib,只需使用标准类库附带的JDK proxies即可。这将按如下方式工作:
<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类似。)
https://stackoverflow.com/questions/28165223
复制相似问题