您可能已猜到了,Array.setByte(Object obj, int i, byte datum) 用字节变量 datum 为 obj 数组的第 i 个元素赋值。这相当于 ((byte[])obj)[i] = datum。
下面开始分析实现的核心部分。我对 Util.initializeApplet(Applet, String) 方法(在“Java 技巧 57”中实现)进行了扩展,在其中添加了一个条件语句,这个条件语句高速缓存数组域并对它们进行初始化。
import java.applet.*;
import java.lang.reflect.*;
import java.util.*;
public abstract class Util {
/**
* 对 applet 的名称以给定筛选前缀开头的非 final 公共域进行初始化。
* 初始值将从 HTML PARAM 标记中读取。
* *
* @param applet 要初始化的 applet。
* @param filterPrefix 只对那些以此前缀开头的域进行初始化。
*
* 如果前缀为空值,将对所有非 final 公共域进行初始化。
*/
public static void initializeApplet(Applet applet, String filterPrefix) {
Class metaclass = applet.getClass();
Field[] fields = metaclass.getFields();
String param = null;
for (int i = 0; i < fields.length; i++) {
try {
param = applet.getParameter(fields[i].getName());
if (param == null ||
Modifier.isFinal(fields[i].getModifiers()) ||
((filterPrefix != null) &&
!fields[i].getName().startsWith(filterPrefix))
)
continue;
Class fieldType = fields[i].getType();
if (fieldType.equals(boolean.class)) {
fields[i].setBoolean(applet, Boolean.valueOf(param).booleanValue());
}
else if (fieldType.equals(byte.class)) {
fields[i].setByte(applet, Byte.valueOf(param).byteValue());
}
/*********************************************
* 具体细节已被删除。请参阅








