我想编写一个注释和一个注释处理器类来处理执行方法所需的时间。此方法将包含用于处理我定义的自定义注释的代码。现在,下面是工作代码,但它有一个陷阱。我需要在具有自定义注释的类中编写main方法,然后调用Annotation处理器类,我想避免使用它。如何克服这个问题。我想要的是每当我在它应该计算的方法上添加@Performance
方法并给出该方法消耗的时间时?任何人都可以告诉我们如何实现这一目标?
注释 -
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Performance {
boolean active() default true;
}
AnnotationProcessor类 公共类AnnotationProcessor扩展Runner {
public void main(Class<?> clazz) {
Long startTime, endTime;
for(Method m : clazz.getMethods()){
if(m.isAnnotationPresent(Performance.class)){
Annotation an = m.getAnnotation(Performance.class);
try{
Performance per = (Performance) an;
if(per.active()){
startTime=System.currentTimeMillis();
System.out.println("---------------- Start time --------["+startTime+"]---------------");
m.invoke(clazz.newInstance());
endTime=System.currentTimeMillis();
System.out.println("---------------- End time ----------["+endTime+"]---------------");
System.out.println("---------------- Time difference :"+(endTime-startTime));
}
}catch(Throwable t){
t.printStackTrace();
}
}
}
}
@Override
public Description getDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public void run(RunNotifier arg0) {
// TODO Auto-generated method stub
}
}
自定义注释的测试类 -
@RunWith(AnnotationProcessor.class)
public class CheckAnnotation {
public CheckAnnotation(){}
public static void main(String[] args) {
method();
methodA();
}
@Performance
public static void method(){
for(int k=0;k<100000;k++)
{
for(int l=3;l<9000000;l++){
//some code
}
}
System.out.println("Writing code done !!!!");
}
@Performance
public static void methodA(){
for(int j=1;j<32434324;j++){
// some code
}
System.out.println("Code execution done !!!!!");
}
}
答案 0 :(得分:0)
在头脑风暴和做一些实验后得到了所需的结果。 请建议是否有更好的方法。仅限注释处理器类中的更改。
public class AnnotationProcessor extends Runner{
public AnnotationProcessor(Class<?> clazz) {
Long startTime, endTime;
for(Method m : clazz.getMethods()){
if(m.isAnnotationPresent(Performance.class)){
Annotation an = m.getAnnotation(Performance.class);
try{
Performance per = (Performance) an;
startTime=System.currentTimeMillis();
System.out.println("---------------- Start time --------["+startTime+"]---------------");
m.invoke(clazz.newInstance());
endTime=System.currentTimeMillis();
System.out.println("---------------- End time ----------["+endTime+"]---------------");
System.out.println("---------------- Time difference :"+(endTime-startTime));
System.out.println();
}catch(Throwable t){
t.printStackTrace();
}
}
}
}
@Override
public Description getDescription() {
return Description.EMPTY;
}
@Override
public void run(RunNotifier arg0) {
// TODO Auto-generated method stub
}
}