使用带有javac的内部sun类

时间:2010-10-31 22:08:48

标签: java javac internal

有没有办法禁用javac 1.6.0_22的限制,阻止我使用像sun.awt.event.*这样的JRE内部类?

正在寻找:

  1. 解释为何被禁止。
  2. 建议使用不同的类
  3. 建议使用反射
  4. 建议使用ecj / eclipse
  5. 我只是想知道它是否可能,如果是,那么如何。

4 个答案:

答案 0 :(得分:87)

我自己找到了答案。

当javac正在编译代码时,默认情况下它不会链接到rt.jar。 相反,它使用带有类存根的特殊符号文件lib/ct.sym

令人惊讶的是,这个文件包含许多但不是全部的内部sun类。 在我的情况下,其中一个比通常更内部的类是sun.awt.event.IgnorePaintEvent

我的问题的答案是:javac -XDignore.symbol.file

这就是javac用于编译rt.jar的内容。

答案 1 :(得分:29)

除了@ marcin-wisnicki的答案,如果您使用Maven note that the compiler plugin will silently drop any -XD flags,除非您还指定 <fork>true</fork>:例如

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArgs>
                    <arg>-XDignore.symbol.file</arg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
            ...

答案 2 :(得分:0)

通常,这只会产生一条警告信息; e.g。

[javac] /media/disk/opensso2/opensso/products/federation/openfm/source/com/sun/identity/wss/xmlsig/WSSSignatureProvider.java:46: warning: com.sun.org.apache.xpath.internal.XPathAPI is Sun proprietary API and may be removed in a future release
[javac] import com.sun.org.apache.xpath.internal.XPathAPI;

也许您已经告诉Java编译器将警告视为错误。

答案 3 :(得分:0)

有一个更好的解决方案。首先将选项添加到javac -XDenableSunApiLintControl,然后在代码中使用@SupressWarnings("sunapi")