A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 doitforyou 于 2013-12-30 01:54 编辑

注解中加入了枚举属性,然后在调用枚举属性的时候发现一个小问题,不是很明白,希望大家探讨下,解我之惑,谢谢了。
代码如下:
枚举TrafficLamp,带有抽象方法nextLamp()
enum TrafficLamp{
      RED{
          public TrafficLamp nextLamp(){    return GREEN;    }
      },
      GREEN{
          public TrafficLamp nextLamp(){     return RED;         }
      };
      public abstract TrafficLamp nextLamp();
}
然后定义了一个注解类,中间加上了枚举属性next返回TrafficLamp类型,在main函数中调用的时候如下:
MyAnnotation ma = MyAnnotation.class.getAnnotation(MyAnnotation.class);
ma.next().nextLamp();调用的时候出现了问题,问题描述如下:
Exception in thread "main" java.lang.IllegalAccessError: tried to access class cn.interview.test.TrafficLamp from class $Proxy3
at $Proxy3.next(Unknown Source)
当我把枚举权限改为public时,可以正常运行,问题这时候就出现了,默认访问权限应该是包内,但这时候却访问失败。
我根据报错信息猜测到一个原因:注解中调用方法的时候可能使用了代理,而代理不属于当前包,是访问不到枚举的,
但是我找了很久没找到更具体的资料,希望各位同学们帮助下,深入一些探讨原因。
技术分就当做随机奖励,因为我不知道怎么根据答案奖励分数。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

12 个回复

正序浏览
doitforyou 发表于 2013-12-28 19:29
看了,你这酱油打的真专业。。。

过奖过奖咧,学的不是很精咧,自己的问题都搞不定了
回复 使用道具 举报
小马过河 发表于 2013-12-28 18:39
哈,你看了张老师的枚举没,多揣摩下哦

看了,你这酱油打的真专业。。。
回复 使用道具 举报

回帖奖励 +1

哈,你看了张老师的枚举没,多揣摩下哦
回复 使用道具 举报
汪洋大海 发表于 2013-12-28 18:13
再打个比方,比如说你在我们公司工作,这个星期是属性是一个枚举,但是不好意思,这个枚举不是public的, ...

好吧,你确定你看题目了吗,题目中我说了我猜测的原因,不是在一个包中,我不明白的是内部怎么进行的,想看下谁有这个代码,内部应该是一个代理,可是我找不到这段内部代理代码。
不过还是谢谢。。。
回复 使用道具 举报
汪洋大海 发表于 2013-12-28 18:06
我想如果把枚举做为注解的属性的话,如果枚举不是public,那么在其它的包中用的话就麻烦了。 ...

再打个比方,比如说你在我们公司工作,这个星期是属性是一个枚举,但是不好意思,这个枚举不是public的,你是不是要疯掉?把所以的代码写在一个包中?
回复 使用道具 举报
doitforyou 发表于 2013-12-28 17:52
你写的enum是public权限的吗?
我的代码是没有问题的,将默认权限的枚举改为public,就可以正常执行了。
...

我想如果把枚举做为注解的属性的话,如果枚举不是public,那么在其它的包中用的话就麻烦了。
回复 使用道具 举报
汪洋大海 发表于 2013-12-28 17:14
我写的是好好的。。
你没有可代码全部贴上来也不好说明什么。
这是的代码,可以正常运行。

你写的enum是public权限的吗?
我的代码是没有问题的,将默认权限的枚举改为public,就可以正常执行了。
关键是默认的枚举类型也应该可以执行啊,感觉不应该存在权限问题
回复 使用道具 举报
新人,低调求分
回复 使用道具 举报
我写的是好好的。。
你没有可代码全部贴上来也不好说明什么。
这是的代码,可以正常运行。
  1. @AnnotationTest//调用自己写的注解
  2. (next = Lamp2.GREEN)
  3. public class Annotation
  4. {
  5.         @SuppressWarnings("deprecation")//这个注解叫压缩警告。
  6.         public static void main(String[] args)
  7.         {
  8.                
  9.                 AnnotationTest annotation = Annotation.class.getAnnotation(AnnotationTest.class);
  10.                 System.out.println(annotation.next().nextLamp().name());
  11.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
汪洋大海 发表于 2013-12-28 16:09
机率这么低?有没有搞错?你敢不敢多送点分?

我能告诉你,我鄙视你吗,如果回答对了10分又如何。。。
看客要有看客的觉悟,无语了。
回复 使用道具 举报

回帖奖励 +1

机率这么低?有没有搞错?你敢不敢多送点分?
回复 使用道具 举报
先回复再说
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马