diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java index 86f5efb6e9..6183b3a4c5 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java @@ -30,6 +30,7 @@ import javax.lang.model.element.TypeElement; import org.androidannotations.AndroidAnnotationsEnvironment; +import org.androidannotations.Option; import org.androidannotations.helper.APTCodeModelHelper; import org.androidannotations.internal.process.ProcessHolder; @@ -41,6 +42,8 @@ public abstract class BaseGeneratedClassHolder implements GeneratedClassHolder { + public static final Option OPTION_GENERATE_FINAL_CLASSES = new Option("generateFinalClasses", "true"); + protected final AndroidAnnotationsEnvironment environment; protected JDefinedClass generatedClass; protected AbstractJClass annotatedClass; @@ -64,10 +67,18 @@ protected void setGeneratedClass() throws Exception { Element enclosingElement = annotatedElement.getEnclosingElement(); GeneratedClassHolder enclosingHolder = environment.getGeneratedClassHolder(enclosingElement); String generatedBeanSimpleName = annotatedElement.getSimpleName().toString() + classSuffix(); - generatedClass = enclosingHolder.getGeneratedClass()._class(PUBLIC | FINAL | STATIC, generatedBeanSimpleName, EClassType.CLASS); + int modifier = PUBLIC | STATIC; + if (environment.getOptionBooleanValue(OPTION_GENERATE_FINAL_CLASSES)) { + modifier |= FINAL; + } + generatedClass = enclosingHolder.getGeneratedClass()._class(modifier, generatedBeanSimpleName, EClassType.CLASS); } else { String generatedClassQualifiedName = annotatedComponentQualifiedName + classSuffix(); - generatedClass = getCodeModel()._class(PUBLIC | FINAL, generatedClassQualifiedName, EClassType.CLASS); + int modifier = PUBLIC; + if (environment.getOptionBooleanValue(OPTION_GENERATE_FINAL_CLASSES)) { + modifier |= FINAL; + } + generatedClass = getCodeModel()._class(modifier, generatedClassQualifiedName, EClassType.CLASS); } codeModelHelper.generify(generatedClass, annotatedElement); setExtends(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/Options.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/Options.java index 2d2fd97a3e..35435e5582 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/Options.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/Options.java @@ -24,6 +24,7 @@ import org.androidannotations.Option; import org.androidannotations.helper.ModelConstants; +import org.androidannotations.holder.BaseGeneratedClassHolder; import org.androidannotations.internal.helper.AndroidManifestFinder; import org.androidannotations.internal.rclass.ProjectRClassFinder; import org.androidannotations.logger.LoggerContext; @@ -43,6 +44,7 @@ public Options(ProcessingEnvironment processingEnvironment) { addSupportedOption(LoggerContext.OPTION_LOG_LEVEL); addSupportedOption(LoggerContext.OPTION_LOG_APPENDER_CONSOLE); addSupportedOption(LoggerContext.OPTION_LOG_APPENDER_FILE); + addSupportedOption(BaseGeneratedClassHolder.OPTION_GENERATE_FINAL_CLASSES); } public void addAllSupportedOptions(List