对于带有静态数组的库包,我有以下的玩具代码:
package testapplets.library;
import javacard.security.RandomData;
public class SomeLibrary {
public static final short TRUE = (short) 0x5AA5;
public static final short FALSE = (short) 0xA55A;
public static final byte[] test = { 'a', 'b', 'c'};
public static short booleantest(boolean b) {
return b ? TRUE : FALSE;
}
public static RandomData getRandom() {
return RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
}
}以及构建库包的以下ant任务:
<target name="libtest" depends="prepare">
<javacard jckit="${converter.sdk}">
<cap targetsdk="${target.sdk}" sources="src/library" package="testapplets.library" aid="11:22:33:44:55" export="lib" output="build/libtest.cap" version="1.0"/>
</javacard>
</target>但是,我收到以下错误消息:
[convert] [ INFO: ] Converter [v3.1.0]
[convert] [ INFO: ] Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved.
[convert]
[convert]
[convert] [ INFO: ] conversion completed with 1 errors and 0 warnings.
[convert] error: Static array initialization in class testapplets/library/SomeLibrary in library package not allowed.为什么库中的静态数组有问题?如果删除静态数组,则构建良好。
发布于 2022-01-01 13:19:50
如果我记得正确使用new在字段初始化是禁止在Java。您必须在静态new方法中执行install (或从install调用的方法),或者标记字段private,在这种情况下,数组存储在常量池中。我强烈建议采用后者。基本上,不允许执行static代码。
使用TRUE和FALSE作为公共静态字段也不是一个好主意,因为它们是引用查找,容易受到定时预言的影响。用这种方式定义TRUE和FALSE的整个想法是为了防止这样的预言和错误注入;我建议让它们成为private。
https://stackoverflow.com/questions/70546475
复制相似问题