/*
* Copyright 2013 Christopher Pheby
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jadira.reflection.access.asm;
import java.lang.reflect.Field;
import org.jadira.reflection.access.api.FieldAccess;
/**
* FieldAccess implementation using an ASM based access strategy
* @param <C> The Class containing the Field to be accessed
*/
public class AsmFieldAccess<C> implements FieldAccess<C> {
private String fieldName;
private AsmClassAccess<C> classAccess;
private Class<C> declaringClass;
private Class<?> fieldClass;
private Field field;
@SuppressWarnings("unchecked")
private AsmFieldAccess(AsmClassAccess<C> classAccess, Field f) {
this.declaringClass = (Class<C>) f.getDeclaringClass();
this.fieldClass = f.getType();
this.classAccess = classAccess;
this.fieldName = f.getName();
this.field = f;
}
@Override
public Class<C> declaringClass() {
return declaringClass;
}
@Override
public Class<?> fieldClass() {
return fieldClass;
}
@Override
public Field field() {
return field;
}
/**
* Get a new instance that can access the given Field
* @param classAccess The AsmClassAccess instance to be delegated to
* @param f Field to be accessed
* @param <C> The type of class
* @return New AsmFieldAccess instance
*/
public static final <C> AsmFieldAccess<C> get(AsmClassAccess<C> classAccess, Field f) {
return new AsmFieldAccess<C>(classAccess, f);
}
@Override
public Object getValue(C parent) {
return classAccess.getValue(parent, fieldName);
}
@Override
public void putValue(C parent, Object newFieldValue) {
classAccess.putValue(parent, fieldName, newFieldValue);
}
@Override
public boolean getBooleanValue(C parent) {
return classAccess.getBooleanValue(parent, fieldName);
}
@Override
public byte getByteValue(C parent) {
return classAccess.getByteValue(parent, fieldName);
}
@Override
public char getCharValue(C parent) {
return classAccess.getCharValue(parent, fieldName);
}
@Override
public short getShortValue(C parent) {
return classAccess.getShortValue(parent, fieldName);
}
@Override
public int getIntValue(C parent) {
return classAccess.getIntValue(parent, fieldName);
}
@Override
public long getLongValue(C parent) {
return classAccess.getLongValue(parent, fieldName);
}
@Override
public float getFloatValue(C parent) {
return classAccess.getFloatValue(parent, fieldName);
}
@Override
public double getDoubleValue(C parent) {
return classAccess.getDoubleValue(parent, fieldName);
}
@Override
public void putBooleanValue(C parent, boolean newFieldValue) {
classAccess.putBooleanValue(parent, fieldName, newFieldValue);
}
@Override
public void putByteValue(C parent, byte newFieldValue) {
classAccess.putByteValue(parent, fieldName, newFieldValue);
}
@Override
public void putCharValue(C parent, char newFieldValue) {
classAccess.putCharValue(parent, fieldName, newFieldValue);
}
@Override
public void putShortValue(C parent, short newFieldValue) {
classAccess.putShortValue(parent, fieldName, newFieldValue);
}
@Override
public void putIntValue(C parent, int newFieldValue) {
classAccess.putIntValue(parent, fieldName, newFieldValue);
}
@Override
public void putLongValue(C parent, long newFieldValue) {
classAccess.putLongValue(parent, fieldName, newFieldValue);
}
@Override
public void putFloatValue(C parent, float newFieldValue) {
classAccess.putFloatValue(parent, fieldName, newFieldValue);
}
@Override
public void putDoubleValue(C parent, double newFieldValue) {
classAccess.putDoubleValue(parent, fieldName, newFieldValue);
}
}