注解类package test;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
TES value();
}
enum TES{
WORK;
}调用类package test;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class DeprecatedTest {
@AnnotationTest(TES.WORK)
public void doSomeThing(){
System.out.println("out something");
}
public static void main(String[] args){
Class<DeprecatedTest> deprecate = DeprecatedTest.class;
try {
Method method = deprecate.getMethod("doSomeThing", new Class[]{});
Object obj = deprecate.newInstance();
method.invoke(obj, new Object[]{});
AnnotationTest annotationTest = method.getAnnotation(AnnotationTest.class);
annotationTest.value();
switch (annotationTest.value()) {
case WORK:
System.out.println("---------1-------");
break; default:
break;
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
抛出的异常
Exception in thread "main" java.lang.IllegalAccessError: tried to access class test.TES from class $Proxy1
at $Proxy1.value(Unknown Source)
at test.DeprecatedTest.main(DeprecatedTest.java:18)是什么问题??

解决方案 »

  1.   

    有两种解决方法。1、把你的枚举类型单独写在一个java文件中。不要写在注解中。
    2.如果非要和注解一个文件的话enum必须是public,但一个源文件中只能有一个public
    所以你要把枚举改成注解的内部枚举
    public @interface 注解{
           public(可选因为只能是public) enum TES {
              WORK;
             }}
    这样就可以了