【问题标题】:How Java Compiler Allow such Class DefinitionJava 编译器如何允许这样的类定义
【发布时间】:2013-07-14 13:25:21
【问题描述】:

我正在深入研究 Java EE 世界。即使在 Java EE 发布了新规范之后,应用服务器制造商也发布了新版本。我知道 Application Server Lib 中存在所有规范实现,并且编译后的 war 文件不需要额外的 jar。除此之外,在开发 JAVA EE 时,假设我们需要遵循依赖关系的 Web 项目

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
    </dependency>

查看 javaee-api-6.0.jar 时,您会发现它只有 957KB,换句话说,它由类方法定义组成。

事实上,上面我已经反编译了 javaee-api-6.0.jar 中的一个类文件,这是一个:我期望所有的类文件都应该是接口和抽象的。但事实并非如此。我想了解的是编译器如何允许这样的Java类具有方法定义,例如:

public ActivationDataFlavor(Class paramClass, String paramString1, String paramString2);

反编译的类文件:

package javax.activation;

import java.awt.datatransfer.DataFlavor;

public class ActivationDataFlavor extends DataFlavor
{
  private String mimeType;
  private MimeType mimeObject;
  private String humanPresentableName;
  private Class representationClass;

  public ActivationDataFlavor(Class paramClass, String paramString1, String paramString2);

  public ActivationDataFlavor(Class paramClass, String paramString);

  public ActivationDataFlavor(String paramString1, String paramString2);

  public String getMimeType();

我的 Java 编译器给出了你所期望的错误。

我不认为 java 编译器不能正常工作,因为所有类文件只有 1KB。

【问题讨论】:

  • 这很可能是您使用的反编译器的问题
  • 我不这么认为,看看更新的图片

标签: java jakarta-ee java-ee-6


【解决方案1】:

这个 jar 只是为了适应编译依赖而存在,不希望在 jvm 中运行。所以所有字节码都被剥离了,这种情况下反编译器无法正常工作。

https://java.net/jira/browse/GLASSFISH-11389

【讨论】:

  • 如何生成这样的jar文件?我的意思是消除编译器阻塞
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2011-08-17
  • 2020-08-04
  • 2012-08-29
相关资源
最近更新 更多