package fr.lteconsulting.hexa.classinfo.internal; import java.util.ArrayList; import java.util.List; import fr.lteconsulting.hexa.classinfo.ClassInfo; import fr.lteconsulting.hexa.classinfo.Clazz; import fr.lteconsulting.hexa.classinfo.Field; import fr.lteconsulting.hexa.classinfo.Method; public abstract class ClazzBase<T> implements Clazz<T> { // To implement : protected abstract List<Field> _getDeclaredFields(); protected abstract List<Method> _getMethods(); protected abstract void _ensureSuperClassInfoRegistered(); private Class<? super T> _superClass; private Class<T> _reflectedClass; private String _className; private List<Field> _allFields; private List<Field> _declaredFields; private List<Field> _fields; private List<Method> _methods; @SuppressWarnings( "unused" ) private ClazzBase() { } @SuppressWarnings( "unchecked" ) protected ClazzBase( Class<?> reflectedClass, String className, Class<? super T> superClass ) { _reflectedClass = (Class<T>) reflectedClass; _className = className; _superClass = superClass; } @Override public Clazz<? super T> getSuperclass() { if( _superClass == null ) return null; _ensureSuperClassInfoRegistered(); return ClassInfo.Clazz( _superClass ); } @Override public String getClassName() { return _className; } @Override public Class<T> getReflectedClass() { _ensureSuperClassInfoRegistered(); return _reflectedClass; } @Override public List<Field> getAllFields() { if( _allFields == null ) { _allFields = _getDeclaredFields(); // all public declared fields of superclass Clazz<? super T> superClass = getSuperclass(); if( superClass != null ) _allFields.addAll( superClass.getAllFields() ); } return _allFields; } @Override public Field getAllField( String name ) { // first, search in declared fields for( Field field : getDeclaredFields() ) if( field.getName().equals( name ) ) return field; // then try superclass Clazz<? super T> superClass = getSuperclass(); if( superClass != null ) return superClass.getAllField( name ); return null; } @Override public List<Field> getDeclaredFields() { if( _declaredFields == null ) _declaredFields = _getDeclaredFields(); return _declaredFields; } @Override public Field getDeclaredField( String name ) { for( Field field : getDeclaredFields() ) if( field.getName().equals( name ) ) return field; return null; } @Override public List<Field> getFields() { if( _fields == null ) { // all public declared fields _fields = new ArrayList<Field>(); for( Field field : getDeclaredFields() ) { if( (field.getModifier() & /*Modifier.PUBLIC*/1) == /*Modifier.PUBLIC*/1 ) _fields.add( field ); } // all public declared fields of superclass Clazz<? super T> superClass = getSuperclass(); if( superClass != null ) _fields.addAll( superClass.getDeclaredFields() ); } return _fields; } @Override public Field getField( String fieldName ) { for( Field field : getFields() ) if( field.getName().equals( fieldName ) ) return field; return null; } @Override public List<Method> getMethods() { if( _methods == null ) { _methods = new ArrayList<Method>(); _methods.addAll( _getMethods() ); } return _methods; } @Override public Method getMethod( String methodName ) { for( Method method : getMethods() ) if( method.getName().equals( methodName ) ) return method; return null; } }