package tk.amberide.ide.data.state.node;
import java.lang.reflect.*;
public class LazyMemberState<T> implements IState<T> {
protected Member member;
protected String name;
protected Object parent;
public LazyMemberState(Field field, String name, Object parent) {
this((Member) field, name, parent);
}
public LazyMemberState(Method method, String name, Object parent) {
this((Member) method, name, parent);
}
LazyMemberState(Member member, String name, Object parent) {
if (Modifier.isStatic(member.getModifiers()) && parent != null) {
throw new IllegalArgumentException("member is static but parent != null");
}
this.member = member;
this.name = name;
this.parent = parent;
}
public Member getMember() {
return member;
}
public T get() {
((AccessibleObject) member).setAccessible(true);
try {
if (member instanceof Method) {
return (T) ((Method) member).invoke(parent);
} else {
return (T) ((Field) member).get(parent);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "LazyMemberState{" + name + ":"
+ member.getDeclaringClass().getName() + "#"
+ member.getName() + (member instanceof Method ? "()" : "") + "}";
}
}