package net.sourceforge.javautil.common.reflection.cache;
import java.lang.annotation.Annotation;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Member;
import java.lang.reflect.Type;
import net.sourceforge.javautil.common.reflection.ReflectionContext;
/**
* Base class for members of a {@link ClassDescriptor}
*
* @author elponderador
* @author $Author: ponderator $
* @version $Id: ClassMember.java 2719 2011-01-11 04:07:57Z ponderator $
*/
public abstract class ClassMember {
/**
* The descriptor this is a member of
*/
protected final ClassDescriptor descriptor;
/**
* @param descriptor The {@link #descriptor}
*/
public ClassMember(ClassDescriptor descriptor) {
this.descriptor = descriptor;
}
/**
* @return The {@link #descriptor}
*/
public ClassDescriptor getDescriptor() { return descriptor; }
/**
* @param <A> The type of annotation
* @param type The class of the type
* @return The instance on this member, or null if no such annotation was specified
*/
public abstract <A extends Annotation> A getAnnotation (Class<A> type);
/**
* @return The annotations specified for this element
*/
public abstract Annotation[] getAnnotations ();
/**
* @return The type of this member
*/
public abstract Class getBaseType ();
/**
* @return The generic type of the member
*/
public abstract Type getGenericType ();
/**
* This will make sure that the member is actually accessible.
*/
public void ensureAccessibility () {
Member member = this.getJavaMember();
if (member instanceof AccessibleObject) {
ReflectionContext.getReflectionManager().ensureAccesssibility( (AccessibleObject) member );
}
}
/**
* @return The java member this is for
*/
public abstract Member getJavaMember ();
}