NativeJavaField.java
package org.mozilla.javascript.lc.member;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.mozilla.javascript.lc.type.TypeInfo;
import org.mozilla.javascript.lc.type.TypeInfoFactory;
/**
 * @author ZZZank
 */
public final class NativeJavaField {
    private final Field field;
    private final boolean isFinal;
    private final TypeInfo type;
    public NativeJavaField(Field field, TypeInfoFactory typeFactory) {
        this.field = field;
        this.isFinal = Modifier.isFinal(field.getModifiers());
        this.type = typeFactory.create(field.getGenericType());
    }
    public Field raw() {
        return field;
    }
    public TypeInfo type() {
        return type;
    }
    public Object get(Object javaObject) throws IllegalAccessException {
        return field.get(javaObject);
    }
    /** Note: will do nothing when called on a final field */
    public void set(Object javaObject, Object value) throws IllegalAccessException {
        if (isFinal) {
            // treat Java final the same as JavaScript [[READONLY]]
            return;
        }
        field.set(javaObject, value);
    }
}