If this project saved you some time or made your day a little easier, a star would mean a lot — it helps others find it too.
This project provides modeling and exporting java source code at java runtime, either in a pre-processing phase or to access them using a dynamic Classloader.
It is a fork of the com.sun.codemodel 2.7-SNAPSHOT.
The classes in this project use a different package name com.helger.jcodemodel to avoid conflicts
with other com.sun.codemodel instances that might be floating around in the classpath.
That of course implies, that this artefact cannot directly be used with JAXB, since the configuration of
this would be very tricky.
- A site with the links to the API docs etc. is available.
- This project has a dedicated documentation folder maintained by helpers. Don't hesitate to help !
Add the following to your pom.xml to use this artifact (where x.y.z denotes the version):
<dependency>
<groupId>com.helger</groupId>
<artifactId>jcodemodel</artifactId>
<version>x.y.z</version>
</dependency>v4.4.1 - work in progress
JOp.EPrecedencederives the binding strength from the declaration order (ordinal ()) again, instead of from an explicitly assigned level.EPrecedence.level ()was removed- Fixed
JOp.EPrecedence.LAMBDAbinding as tight asASSIGNMENT- a lambda binds looser, becausea -> v = aisa -> (v = a). See #195 - thx @glelouet - Fixed the second operand of the ternary operator losing its parentheses in the
ALWAYSandNOTOKENstrategies. See #195 - thx @glelouet
v4.4.0 - 2026-09-10
- Expressions no longer surround themselves with parentheses - parentheses are only printed where the Java syntax requires them, so
Math.sqrt (((x*x)+(y*y)))is now emitted asMath.sqrt (x*x + y*y). The new formatter settingparentheses.globalselects the strategy:REQUIRED(default),NOTOKENorALWAYS. See #183 - thx @glelouet - Added
IJGenerable.operatorPrecedence ()returning the new enumJOp.EPrecedence, which carries the binding strength and the associativity of an operator.JOp.needsParentheses (...)and the new enumJOp.ESidedecide whether a single operand has to be grouped - The unary, binary and ternary operators are now modelled by the new enums
JOpUnary.EUnaryOp,JOpBinary.EBinaryOpandJOpTernary.ETernaryOpinstead of plain strings - Removed
JOpUnaryTight-JOp.preincr,JOp.postincr,JOp.predecrandJOp.postdecrnow returnJOpUnary - Removed
JOp.hasTopOp (IJExpression)- the test expression ofif,while,doandswitchis now always parenthesized - The formatter no longer emits a space next to an already existing one, so
case 0 :is nowcase 0:,return 10;is nowreturn 10;andcase 0, 2 ->is nowcase 0, 2 -> - Added
IJFormatter.printNoSpace (String)for tokens that must stay attached to the previous one. A postfix operator now uses it, soa ++is emitted asa++ - Added the new package
literalswithEIntegerBase,IntegerRepresentationandAIntegerRepresentedto define howintandlongliterals are emitted: base (binary, decimal, hexadecimal or octal), padding,_separators, positive sign and prefix/body/suffix casing. The predefined representationsBIN,BIN8,DEC,HEXandOCTare available; the default output is unchanged plain decimal. See #181 and #182 - thx @glelouet JAtomIntandJAtomLongextend the new classAIntegerRepresentedand offer a fluent API to select the representation per instance:binary (),decimal (),hexadecimal (),octal (),padding (int),separateEvery (int),separatorSize (int)andpositiveSign (boolean). See #188 - thx @glelouetIllegalStateExceptionandIllegalArgumentExceptionare thrown instead of the genericRuntimeException. See #185 and #187 - thx @glelouet- Also fixes the plugin not trying to fetch the source as an url, and showing errors when no error happened.
- Also fixes the plugin silently skipping when the source could not be loaded.
- Maven plugin: the
dataand thesourceparameters are now both applied, instead ofdatasuperseedingsource. The generators receive the newISourcedInputStream, that keeps the source an inputstream was created from. See #186 and #190 - thx @glelouet - Maven plugin: the
sourceparameter may now also point to a directory - all contained files are then processed one after the other, optionally limited by the newsourcesFilterparameter. See #184 - thx @glelouet - Maven plugin: the source files are opened one at a time and always closed, even if the generation fails
- Maven plugin: directories are no longer skipped by
sourcesFilter- the filter applies to the files only, as documented - Maven plugin: symbolic link loops inside a source directory no longer lead to an endless recursion
- Maven plugin: the generator is now always configured, so that it gets its default parameters even if no
paramsare set - Maven plugin: the goal may now also be invoked with the short prefix
jcm, as inmvn jcm:generate-source, instead ofjcodemodel. The Maven help output of the mojo and of all its parameters was reworked. See #194 - thx @glelouet - Maven plugin: the String parameters are now tested for blankness instead of emptiness, so a whitespace only value is treated as "not set". See #194 - thx @glelouet
- Maven plugin: the generator is now also invoked if neither
sourcenordatais configured - it then receivesISourcedInputStream.NULLinstead of nothing. See #193 - thx @glelouet - Generators that ignore their source now log a warning instead of silently discarding it. See #193 - thx @glelouet
- CSV generator: the source is now read as UTF-8 by default, instead of the platform default charset. Use the new
charsetparameter to change it - CSV generator: the
field_sepparameter is now used as a literal separator and no longer as a regular expression - CSV generator: a line containing only separators no longer throws an
ArrayIndexOutOfBoundsException - CSV generator: the
concrete.list,concrete.mapandconcrete.setparameters are now taken into account - CSV and JSON generators: a source without inputstream is handled as an empty source instead of throwing a
NullPointerException - JSON generator: large sources no longer lead to a
StackOverflowErrorwhen collecting the records - Flat structure generators: the classes referenced by the source are no longer initialized when they are resolved
- Extended the documentation on how to write own generators. See #189 - thx @glelouet
v4.3.0 - 2026-07-24
- Naming a class
varnow throws an exception, asvaris no longer a valid type identifier (Varis still allowed). See #180 - thx @glelouet - Added support for pattern matching variables via new class
JPatternVarin thevarspackage. See #169 and #170 - thx @glelouet - Started moving
JFieldVarinto thevarspackage. See #172 and #175 - thx @glelouet - Renamed the
expressionpackage toexpressions(affectsJArrayInitandJInstanceOfVar). See #170 - thx @glelouet - Fixed the
finalmodifier detection inJMethod.param (...)andJMethod.varParam (...)(used|instead of&). See #169 - thx @glelouet - Added support for switch expressions (Java 14+) via new classes
JSwitchExpression,JYieldand arrow-style cases. See #144 - thx @glelouet - Added support for pattern matching with
instanceofvia new classJInstanceOfVar, invoked throughJExpr.instanceOf (...). See #162 - thx @glelouet - Added support for the
sealedandnon-sealedmodifiers and thepermitsclause onJDefinedClass. See #150 - thx @glelouet - Added support for local variable type inference (
var);JVarno longer requires an explicit type. See #161 - thx @glelouet - Added the lazy initialization pattern via new class
JLazy. See #160 - thx @glelouet - Added a concise try-with-resources syntax. See #142 - thx @glelouet
- Added new interface
IJModifiedand theemod (EMod...)API (with new enumEMod), implemented byJMods,JDefinedClass,JVar,JFieldVarandJMethod. See #155 - thx @glelouet - Added configurable formatter settings via
FormatterSettingsto control indentation and line wrapping. See #163 - thx @glelouet - Added
JCMWriter.setJavaFeature (int)to target a specific Java feature version; features requiring a higher level may be replaced with fallback code. See #143 - Fixed text block (
JTextBlock) indentation handling. See #148 and #158 - thx @glelouet
v4.2.1 - 2026-05-29
- Added support for annotations with parameters on type annotations and fixed
@sincetags. See #130 - thx @joelittlejohn - Added support for Java text blocks via #145 and #147, including a
keepWhiteSpacesoption - thx @glelouet - Generated test sources now carry an
@Generatedannotation #149 - thx @glelouet - Added proper license headers to the
generated/javatestssources #139 - thx @glelouet
v4.2.0 - 2026-05-13
- Removed OSGI bundling
- Added support for Java
recordtypes. Fixes #98 via #126 - thx @joelittlejohn - Added support for annotation target
TYPE_USE. Fixes #50 via #127 - thx @joelittlejohn - Added
JDefinedClass.isRecord ()and a mutable accessorrecordComponentsMutable ();recordComponents ()now returns an immutable list - Added
JExpr.ref (JRecordComponent)andJExpr.refthis (JRecordComponent)for nicer record component references - Added
JBlock._throw (AbstractJClass, IJExpression...)overload for throwing an exception with constructor arguments - Fixed JavaDoc reference to use
JCMWriterinstead of the deprecatedcm.build (...). See #135
v4.1.0 - 2025-11-16
- Updated to ph-commons 12.1.0
- Using JSpecify annotations
- Added Maven plugin to generate Java code from CSV, JSON or YAML. Thanks a million to @glelouet for providing all of the great work
v4.0.0 - 2025-08-25
- Requires Java 17 as the minimum version
- Using
ph-commonsas a compile dependency for common stuff - Moved all exceptions to
exceptionspackage - Included [PR #96]](#96) from @glelouet on copying the whole JCodeModel
v3.4.1 - 2022-01-20
- Extended
JDefinedClassto make enum constants accessible
v3.4.0 - 2020-05-25
- Added special top-level construct
JResourceDirto represent pure resource directories (issue #74 from @guiguilechat) - Added new class
JCodeModelExceptionas the base class forJClassAlreadyExistsExceptionand the new classJResourceAlreadyExistsException - Existing APIs were changed to throw
JCodeModelExceptioninstead ofJClassAlreadyExistsException JCNameUtilities.getFullNameworks with classes in the default package- Extended
JCodeModelwith(get|set)FileSystemConventionto make the creation more flexible (also issue #74 from @guiguilechat) - Added mutable overloads to methods that only return an unmodifiable collection (issue #86)
- Fixed an issue with generating generics from anonymous classes (issue #84)
v3.3.0 - 2019-11-24
- Added check for package names so that no invalid package names can be created (issue #70 from @guiguilechat)
- Added check to avoid creating classes existing in the "java.lang" package (issue #71 from @guiguilechat)
JLambdaMethodRefnow works with arbitrary expressions as the left hand side
v3.2.4 - 2019-07-15
- Made class
JavaUnicodeEscapeWriterpublicly accessible - Extended enum constant ref API (issue #68 from @guiguilechat)
v3.2.3 - 2019-03-31
- Extended
JTryBlockAPI to have more control. - Added support for
try-with-resourcessupport (issue #67 from @gmcfall)
v3.2.2 - 2019-02-25
- Using
jsr305instead ofannotationsin POM (issue #66 from @jjYBdx4IL)
v3.2.1 - 2019-01-23
- Added
varas reserved word - Made
JReturnconstructor public - Added
JInvocation._thisstatic method - Added
IJExpression.castTomethod - Added support to create
finalvariables infor eachloops JExpr.dotClassnow takesAbstractJTypeand not justAbstractJClass- Made constructors of subclasses of
IJStatementpublic - No line breaks for annotations to parameters
- Put each method parameter on a separate line if more than 3 parameters are present
v3.2.0 - 2018-10-20
- Introduced class
JCMWriterthat should be used to emit the outgoing Java files. This replacescodemodel.buildand offers a more consistent API. Most existing method remain existing and deprecated and just forward toJCMWriter.- Instead of
cm.build (...)usenew JCMWriter (cm).build (...)
- Instead of
- Extracted
IJFormatterinterface for better separation of concerns.JFormatterwas moved to a sub-package ProgressCodeWriterno longer needs an explicitPrintStreambut aProgressCodeWriter.IProgressTrackerinstead.- Default charset for Java classes is now
UTF-8. - Added new
JAnnotationUsemethod overloads that automatically passvalueas the annotation parameter name (issue #64)
v3.1.0 - 2018-08-22
- Added
AbstractJType._new() - Change return types of special
JBlockmethods tovoidto avoid chaining (issue #62) - incompatible change! - Added new
JExpr.invokeThisandJExpr.invokeSuperstatic methods
v3.0.3 - 2018-06-12
- Improved API access to inner classes (issue #60)
- Changed order of emitted modifiers (
final static->static final) - Flush needed when writing resources fixed (issue #61 from @fbaro)
v3.0.2 - 2018-04-11
- Fixed method resolution using direct class references (issue #58)
- Added some additional
JInvocation.arg...sanity methods - Enum constant argument list is now accessible
v3.0.1 - 2017-10-25
- Added explicit support for invoking
super- thx to @heruan for pointing this out - Added possibility to create a lambda reference from an invocation (issue #56 and PR #57 from @heruan)
v3.0.0 - 2017-08-06
- Requires Java 8
- Reworked #41 so that it is finally working in all cases
- Add option for classes to not be imported (issue #51)
- Fixed extra semicolon on Lambdas (issue #53)
v2.8.6 2016-07-19
- added PR (issue #49)
v2.8.5 - 2016-05-13
- improved comment handling (issue #47)
- improved API checks (issue #45)
- extended API (issue #46)
v2.8.4 - 2016-04-25
- Enum values in switch statements are no longer fully qualified (issue #41)
- fixed generation of narrowed classes without parameters (as in
HashMap<>) - added support for
strictfpkeyword.
v2.8.3 - 2016-02-26
- Added support for single line comments in blocks
- improved generation of Lambdas
v2.8.2 - 2016-01-19
- Customizable new line string and character set
- extensions by @sviperll
v2.8.1 - 2015-12-03
- Extensions by @sviperll
v2.8.0 - 2015-10-12
- Requires Java 1.6
- fixed potential double imports
- added virtual blocks
- integrated sviperll's metachicory
v2.7.11 - 2015-09-24
- Bugfix release
- removed half done CSE implementation (issue #18)
- improved handling of directClasses
- added enumConstantReference
v2.7.10 - 2015-06-30
- Synchronized block added
- initial support for lambda expressions
v2.7.9 - 2015-03-19
- Minor extensions for error types
v2.7.8 - 2015-02-05
- Enum constants for annotation parameters
v2.7.7 - 2014-09-17
- mainly API extensions
v2.7.6 - 2014-09-02
- Extended annotation parameter handling API
v2.7.5 - 2014-08-14
- Support for multiple boundaries added (like
T extends AnyClass & Serializable)
v2.7.4 - 2014-06-12
- Bugfix release
v2.7.3 - 2014-05-23
- Bugfix release
v2.7.2 - 2014-05-21
- now on Maven Central
v2.7.1 - 2014-05-19
- now as OSGi bundle
v2.7.0 - 2014-05-16
- API extensions
v2.6.4 - 2014-04-10
2013-09-23
- Changes from https://github.com/UnquietCode/JCodeModel have been incorporated.
My personal Coding Styleguide | It is appreciated if you star the GitHub project if you like it.