Created
January 21, 2013 13:35
DynamicAccessor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 동적으로 객체의 속성, 메소드에 접근할 수 있는 접근자입니다. | |
* User: sunghyouk.bae@gmail.com | |
* Date: 13. 1. 21 | |
*/ | |
@Slf4j | |
public class DynamicAccessor<T> { | |
private final Class<T> targetType; | |
private final ConstructorAccess<T> ctorAccessor; | |
private final FieldAccess fieldAccessor; | |
private final MethodAccess methodAccessor; | |
private final List<String> fieldNames; | |
private final List<String> methodNames; | |
public DynamicAccessor(Class<T> targetType) { | |
Guard.shouldNotBeNull(targetType, "targetType"); | |
if (log.isDebugEnabled()) | |
log.debug(""); | |
this.targetType = targetType; | |
this.ctorAccessor = ConstructorAccess.get(this.targetType); | |
this.fieldAccessor = FieldAccess.get(this.targetType); | |
this.methodAccessor = MethodAccess.get(this.targetType); | |
this.fieldNames = Lists.newArrayList(fieldAccessor.getFieldNames()); | |
this.methodNames = Lists.newArrayList(methodAccessor.getMethodNames()); | |
} | |
@SuppressWarnings("unchecked") | |
public <T> T newInstance() { | |
return (T) ctorAccessor.newInstance(); | |
} | |
@SuppressWarnings("unchecked") | |
public <T> T newInstance(Object enclosingInstance) { | |
return (T) ctorAccessor.newInstance(enclosingInstance); | |
} | |
public String[] getFieldNames() { | |
return fieldAccessor.getFieldNames(); | |
} | |
public String[] getMethodNames() { | |
return methodAccessor.getMethodNames(); | |
} | |
public Object getField(Object instance, String fieldName) { | |
return fieldAccessor.get(instance, fieldName); | |
} | |
public void setField(Object instance, String fieldName, Object nv) { | |
fieldAccessor.set(instance, fieldName, nv); | |
} | |
public void setFieldBoolean(Object instance, String fieldName, boolean nv) { | |
fieldAccessor.setBoolean(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldByte(Object instance, String fieldName, byte nv) { | |
fieldAccessor.setByte(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldChar(Object instance, String fieldName, char nv) { | |
fieldAccessor.setChar(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldDouble(Object instance, String fieldName, double nv) { | |
fieldAccessor.setDouble(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldFloat(Object instance, String fieldName, float nv) { | |
fieldAccessor.setFloat(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldInt(Object instance, String fieldName, int nv) { | |
fieldAccessor.setInt(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldLong(Object instance, String fieldName, long nv) { | |
fieldAccessor.setLong(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public void setFieldShort(Object instance, String fieldName, short nv) { | |
fieldAccessor.setShort(instance, fieldAccessor.getIndex(fieldName), nv); | |
} | |
public Object getProperty(Object instance, String fieldName) { | |
String methodName = | |
(methodNames.contains(fieldName)) ? fieldName : "get" + getPropertyName(fieldName); | |
return invoke(instance, methodName); | |
} | |
public void setProperty(Object instance, String fieldName, Object nv) { | |
String methodName = | |
(methodNames.contains(fieldName)) ? fieldName : "set" + getPropertyName(fieldName); | |
invoke(instance, methodName, nv); | |
} | |
public Object invoke(Object instance, String methodName, Object... args) { | |
return methodAccessor.invoke(instance, methodName, args); | |
} | |
private static final String getPropertyName(String filedName) { | |
return filedName.substring(0, 1).toUpperCase() + filedName.substring(1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment