如何在使用javaassist创建类时将@Override注释添加到方法中?
ClassPool pool = ClassPool.getDefault();
CtClass ctClasz = pool.makeClass("test.ExampleImpl");
ctClasz.addInterface(pool.get(MyInterface.class.getName()));
CtMethod method = CtNewMethod.make ("@Override public void print() { System.out.println(\"Hello! \"); }", ctClasz);
ctClasz.addMethod(method);
System.out.println("Implementd: Interfaces:" + ctClasz.getInterfaces());
System.out.println("Methods: " + ctClasz.getMethods());
ctClasz.writeFile("D:");此代码抛出异常,如下所示:
Exception in thread "main" javassist.CannotCompileException: [source error] syntax error
near "@Override p"
at javassist.CtNewMethod.make(CtNewMethod.java:78)
at javassist.CtNewMethod.make(CtNewMethod.java:44)
at javaassist.Demo.main(Demo.java:17)
Caused by: compile error: syntax error near "@Override p"
at javassist.compiler.Parser.parseClassType(Parser.java:983)
at javassist.compiler.Parser.parseFormalType(Parser.java:191)
at javassist.compiler.Parser.parseMember1(Parser.java:51)
at javassist.compiler.Javac.compile(Javac.java:89)
at javassist.CtNewMethod.make(CtNewMethod.java:73)
... 2 more发布于 2012-07-03 22:34:43
@Override不是一个运行时注释,所以即使您可以添加它,也不会有任何不同。
对于具有运行时效果(RetentionPolicy.RUNTIME)的注释,您可以查看this question。
发布于 2012-07-03 22:32:47
简短版本
添加注释并不有趣。因为这有@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.SOURCE),所以不会有任何不同。所以,你不需要关心这个问题。
我会关心具有@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)保留的注释。
长版本
此声明具有@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.SOURCE)保留功能,这意味着即使您在生成一些运行时使用的类时使用JAVASSIST添加它,它也不会更改任何内容。
注释对代码没有任何影响。当Java生成源代码时,它已经被剥离了。当JAVASSIST生成代码时,添加它是没有意义的。
根据documentation,保留期可以配置为:
在JAVASSIST中,添加运行时或类注释会很有趣(但是对于类来说就不那么有趣了,请参阅here)。
发布于 2012-07-04 03:06:51
@Override只对编译器有用。
它告诉编译器确保带注释的方法:
a. Overrides a method on the superclass
b. Implements an interface method.当接口或超类发生变化时,这就变得特别重要。您的类可能会以其他方式编译,但您认为正在接口或超类上定义功能的方法可能不再执行此操作。
因此,在这种情况下,@Override注解会让编译器向您发出警告。
编辑
示例:
public interface Foo {
void bar();
}
public class FooImpl {
public void bar() { ... }
}
public class MyFooExtension extends FooImpl {
public void bar() { .... }
}现在,让我们假设Foo和FooImpl改变:
public interface Foo {
void bar(String input);
}
public class FooImpl {
public void bar(String input) { ... }
}您的MyFooExtension类仍然可以编译,但是该类中的"bar()“方法永远不会被调用。因此,您的方法是无用的。如果你添加了@Override注解,你会得到一个编译错误,告诉你没有方法"void bar()“被重写,你必须修复你的类才能编译它。
https://stackoverflow.com/questions/11313114
复制相似问题