javax:javaee-api-6.0包含没有方法体的非抽象类

时间:2013-11-21 15:32:24

标签: java java-ee java-ee-6 java-ee-7

我是Java EE的新手,当我查看已编译的代码(我找不到javax的源代码:javaee-api-6.0)时,我注意到这个类。

package javax.servlet;

import java.util.EventObject;

public class ServletContextEvent extends EventObject
{
  public ServletContextEvent(ServletContext paramServletContext);

  public ServletContext getServletContext();
}

然而,javax中的同一个类:javaee-api-7.0就是这个。

package javax.servlet;

import java.util.EventObject;

public class ServletContextEvent extends EventObject
{
  private static final long serialVersionUID = -7501701636134222423L;

  public ServletContextEvent(ServletContext source)
  {
    super(source);
  }

  public ServletContext getServletContext()
  {
    return (ServletContext)super.getSource();
  }
}

在同一个包中也会发生ServletException(可能会有更多,因为我没有经历过每一个)。

假设Java Decompiler给了我源代码的样子,从纯java语法的角度来看,我无法理解为什么6.0类不是抽象的(或者不是接口)。

问题1。为什么6.0中的类不是抽象的或接口?

问题2。为什么在7.0中更改了实施?当用javaee-api编译代码时,人们是否意识到6.0版本会造成麻烦?

我问的原因是因为在Intellij IDEA(12.1.4)中使用javaee-web-api(与javaee-api类似,参见this)时,我实际上遇到了编译错误。错误如下所示:

Internal error: (java.lang.ClassFormatError) Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletContextEvent

所以问题3。在Intellij IDEA中有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:2)

  

人们是否意识到6.0版本会给你带来麻烦   用javaee-api编译代码?

是的,其中一个问题是您在运行测试时无法使用这些类。请参阅this Arquillian FAQAdam Bien's blog post

  

有没有办法在Intellij IDEA中避免这种情况?

请参阅上面的链接。解决方案并非特定于Intellij IDEA。