我们正在迁移我们的旧代码,实际上是相当旧的Java 11。我在编译其中一个类时遇到问题。示例代码如下:
package XXXX;
import java.lang.ref.*;
import sun.security.action.*;
import java.security.*;
import java.io.*;
class Converters
{
private static Object lock;
private static String converterPackageName;
private static String defaultEncoding;
public static final int BYTE_TO_CHAR = 0;
public static final int CHAR_TO_BYTE = 1;
private static final String[] converterPrefix;
private static SoftReference[] classCache;
static /* synthetic */ Class class$sun$io$Converters;
private static String getConverterPackageName() {
final String converterPackageName = Converters.converterPackageName;
if (converterPackageName != null) {
return converterPackageName;
}
String converterPackageName2 = AccessController.doPrivileged((PrivilegedAction<String>)new GetPropertyAction("file.encoding.pkg"));
if (converterPackageName2 != null) {
Converters.converterPackageName = converterPackageName2;
}
else {
converterPackageName2 = "sun.io";
}
return converterPackageName2;
}
private static Class getConverterClass(final int n, final String s) throws UnsupportedEncodingException {
String aliasName = null;
if (!s.equals("ISO8859_1")) {
if (s.equals("8859_1")) {
aliasName = "ISO8859_1";
}
else if (s.equals("ISO8859-1")) {
aliasName = "ISO8859_1";
}
else if (s.equals("646")) {
aliasName = "ASCII";
}
else {
aliasName = CharacterEncoding.aliasName(s);
}
}
if (aliasName == null) {
aliasName = s;
}
try {
return Class.forName(getConverterPackageName() + "." + Converters.converterPrefix[n] + aliasName);
}
catch (ClassNotFoundException ex) {
throw new UnsupportedEncodingException(aliasName);
}
}
private static Object newConverter(final String s, final Class clazz) throws UnsupportedEncodingException {
try {
return clazz.newInstance();
}
catch (InstantiationException ex) {
throw new UnsupportedEncodingException(s);
}
catch (IllegalAccessException ex2) {
throw new UnsupportedEncodingException(s);
}
}
static Object newConverter(final int n, final String s) throws UnsupportedEncodingException {
final Class converterClass;
synchronized (Converters.lock) {
converterClass = getConverterClass(n, s);
}
return newConverter(s, converterClass);
}
private static Class getDefaultConverterClass(final int n) {
boolean b = false;
final SoftReference softReference = Converters.classCache[n];
if (softReference != null) {
final Class clazz = softReference.get();
if (clazz != null) {
return clazz;
}
Converters.classCache[n] = null;
}
String defaultEncoding = Converters.defaultEncoding;
if (Converters.defaultEncoding != null) {
b = true;
}
else {
defaultEncoding = AccessController.doPrivileged((PrivilegedAction<String>)new GetPropertyAction("file.encoding"));
if (defaultEncoding != null) {
Converters.defaultEncoding = defaultEncoding;
b = true;
}
else {
defaultEncoding = "ISO8859_1";
}
}
Class clazz2;
try {
clazz2 = getConverterClass(n, defaultEncoding);
if (b) {
Converters.classCache[n] = new SoftReference(clazz2);
}
}
catch (UnsupportedEncodingException ex) {
try {
clazz2 = getConverterClass(n, "ISO8859_1");
}
catch (UnsupportedEncodingException ex2) {
throw new InternalError("Cannot find default " + Converters.converterPrefix[n] + " converter class");
}
}
return clazz2;
}
static Object newDefaultConverter(final int n) {
final Class defaultConverterClass;
synchronized (Converters.lock) {
defaultConverterClass = getDefaultConverterClass(n);
}
try {
return newConverter("", defaultConverterClass);
}
catch (UnsupportedEncodingException ex) {
throw new InternalError("Cannot instantiate default converter class " + defaultConverterClass.getName());
}
}
static /* synthetic */ Class class$(final String s) {
try {
return Class.forName(s);
}
catch (ClassNotFoundException ex) {
throw new NoClassDefFoundError(ex.getMessage());
}
}
static {
Converters.lock = ((Converters.class$sun$io$Converters == null) ? (Converters.class$sun$io$Converters = class$("sun.io.Converters")) : Converters.class$sun$io$Converters);
Converters.converterPackageName = null;
Converters.defaultEncoding = null;
converterPrefix = new String[] { "ByteToChar", "CharToByte" };
Converters.classCache = new SoftReference[2];
}
}在使用javac Converter.java编译它时,我得到以下错误:
import sun.security.action.*;
^
(package sun.security.action is declared in module java.base, which does not export it to the unnamed module)
Converters.java:47: error: cannot find symbol
aliasName = CharacterEncoding.aliasName(s);
^
symbol: variable CharacterEncoding
location: class Converters
Converters.java:85: error: incompatible types: Object cannot be converted to Class
final Class clazz = softReference.get();
^
Note: Converters.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Converters.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
3 errors我尝试使用--add--export java.base/sun.security=All-UNNAMED导出它,但它仍然抛出错误。
有什么帮助吗?还想知道有没有其他方法来删除这个旧的旧代码与新的。
发布于 2019-01-22 21:57:04
正如所指出的,这些是不应该直接使用的内部类。如果重构超出了范围,你应该使用--add-export,这应该是可行的!
您的--add-export参数是错误的。您需要使用正确的包来导出(在本例中为sun.security.action)和模块的名称(如果不使用模块,则全部为未命名,全部使用大写字母 !)。
所以这应该是--add-exports java.base/sun.security.action=ALL-UNNAMED
来自javac的文档:
--add-exports module/ package = other-module (,other- module )*指定当other-module的值为all - unnamed时,将包视为从其定义模块导出到其他模块或导出到所有未命名模块。
发布于 2019-01-25 14:57:05
从Java9开始,JDK的大多数内部API都是are inaccessible at compile time的(将来,它们在运行时也将不可访问)。sun.security.action是一个内部包,所以你应该避免使用它。在您的示例中,您可以简单地删除new GetPropertyAction("file.encoding.pkg")并将其替换为一个lambda:
AccessController.doPrivileged((PrivilegedAction<Object>) () -> System.getProperty("prop"));https://stackoverflow.com/questions/54306697
复制相似问题