1 package com.fasterxml.jackson.databind.deser; 2 3 import java.io.IOException; 4 5 import com.fasterxml.jackson.databind.*; 6 import com.fasterxml.jackson.databind.cfg.CoercionAction; 7 import com.fasterxml.jackson.databind.cfg.CoercionInputShape; 8 import com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer; 9 import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams; 10 import com.fasterxml.jackson.databind.type.LogicalType; 11 import java.math.BigDecimal; 12 import java.math.BigInteger; 13 14 /** 15 * Class that defines simple API implemented by objects that create value 16 * instances. Some or all of properties of value instances may 17 * be initialized by instantiator, rest being populated by deserializer, 18 * to which value instance is passed. 19 * Since different kinds of JSON values (structured and scalar) 20 * may be bound to Java values, in some cases instantiator 21 * fully defines resulting value; this is the case when JSON value 22 * is a scalar value (String, number, boolean). 23 *<p> 24 * Note that this type is not parameterized (even though it would seemingly 25 * make sense), because such type information cannot be use effectively 26 * during runtime: access is always using either wildcard type, or just 27 * basic {@link java.lang.Object}; and so adding type parameter seems 28 * like unnecessary extra work. 29 *<p> 30 * Actual implementations are strongly recommended to be based on 31 * {@link com.fasterxml.jackson.databind.deser.std.StdValueInstantiator} 32 * which implements all methods, and as such will be compatible 33 * across versions even if new methods were added to this interface. 34 */ 35 public abstract class ValueInstantiator 36 { 37 /* 38 /********************************************************** 39 /* Introspection 40 /********************************************************** 41 */ 42 43 /** 44 * @since 2.9 45 */ 46 public interface Gettable { getValueInstantiator()47 public ValueInstantiator getValueInstantiator(); 48 } 49 50 /* 51 /********************************************************** 52 /* Life-cycle 53 /********************************************************** 54 */ 55 56 /** 57 * "Contextualization" method that is called after construction but before first 58 * use, to allow instantiator access to context needed to possible resolve its 59 * dependencies. 60 * 61 * @param ctxt Currently active deserialization context: needed to (for example) 62 * resolving {@link com.fasterxml.jackson.databind.jsontype.TypeDeserializer}s. 63 * 64 * @return This instance, if no change, or newly constructed instance 65 * 66 * @throws JsonMappingException If there are issues with contextualization 67 * 68 * @since 2.12 69 */ createContextual(DeserializationContext ctxt, BeanDescription beanDesc)70 public ValueInstantiator createContextual(DeserializationContext ctxt, BeanDescription beanDesc) 71 throws JsonMappingException 72 { 73 return this; 74 } 75 76 /* 77 /********************************************************** 78 /* Metadata accessors 79 /********************************************************** 80 */ 81 82 /** 83 * Accessor for raw (type-erased) type of instances to create. 84 *<p> 85 * NOTE: since this method has not existed since beginning of 86 * Jackson 2.0 series, default implementation will just return 87 * <code>Object.class</code>; implementations are expected 88 * to override it with real value. 89 * 90 * @since 2.8 91 */ getValueClass()92 public Class<?> getValueClass() { 93 return Object.class; 94 } 95 96 /** 97 * Method that returns description of the value type this instantiator 98 * handles. Used for error messages, diagnostics. 99 */ getValueTypeDesc()100 public String getValueTypeDesc() { 101 Class<?> cls = getValueClass(); 102 if (cls == null) { 103 return "UNKNOWN"; 104 } 105 return cls.getName(); 106 } 107 108 /** 109 * Method that will return true if any of {@code canCreateXxx} method 110 * returns true: that is, if there is any way that an instance could 111 * be created. 112 */ canInstantiate()113 public boolean canInstantiate() { 114 return canCreateUsingDefault() 115 || canCreateUsingDelegate() || canCreateUsingArrayDelegate() 116 || canCreateFromObjectWith() || canCreateFromString() 117 || canCreateFromInt() || canCreateFromLong() 118 || canCreateFromDouble() || canCreateFromBoolean(); 119 } 120 121 /** 122 * Method that can be called to check whether a String-based creator 123 * is available for this instantiator. 124 *<p> 125 * NOTE: does NOT include possible case of fallbacks, or coercion; only 126 * considers explicit creator. 127 */ canCreateFromString()128 public boolean canCreateFromString() { return false; } 129 130 /** 131 * Method that can be called to check whether an integer (int, Integer) based 132 * creator is available to use (to call {@link #createFromInt}). 133 */ canCreateFromInt()134 public boolean canCreateFromInt() { return false; } 135 136 /** 137 * Method that can be called to check whether a long (long, Long) based 138 * creator is available to use (to call {@link #createFromLong}). 139 */ canCreateFromLong()140 public boolean canCreateFromLong() { return false; } 141 142 /** 143 * Method that can be called to check whether a BigInteger based creator is available 144 * to use (to call {@link #createFromBigInteger}). + 145 */ canCreateFromBigInteger()146 public boolean canCreateFromBigInteger() { return false; } 147 148 /** 149 * Method that can be called to check whether a double (double / Double) based 150 * creator is available to use (to call {@link #createFromDouble}). 151 */ canCreateFromDouble()152 public boolean canCreateFromDouble() { return false; } 153 154 /** 155 * Method that can be called to check whether a BigDecimal based creator is available 156 * to use (to call {@link #createFromBigDecimal}). 157 */ canCreateFromBigDecimal()158 public boolean canCreateFromBigDecimal() { return false; } 159 160 /** 161 * Method that can be called to check whether a double (boolean / Boolean) based 162 * creator is available to use (to call {@link #createFromDouble}). 163 */ canCreateFromBoolean()164 public boolean canCreateFromBoolean() { return false; } 165 166 167 /** 168 * Method that can be called to check whether a default creator (constructor, 169 * or no-arg static factory method) 170 * is available for this instantiator 171 */ canCreateUsingDefault()172 public boolean canCreateUsingDefault() { return getDefaultCreator() != null; } 173 174 /** 175 * Method that can be called to check whether a delegate-based creator (single-arg 176 * constructor or factory method) 177 * is available for this instantiator 178 */ canCreateUsingDelegate()179 public boolean canCreateUsingDelegate() { return false; } 180 181 /** 182 * Method that can be called to check whether a array-delegate-based creator 183 * (single-arg constructor or factory method) 184 * is available for this instantiator 185 * 186 * @since 2.7 187 */ canCreateUsingArrayDelegate()188 public boolean canCreateUsingArrayDelegate() { return false; } 189 190 /** 191 * Method that can be called to check whether a property-based creator 192 * (argument-taking constructor or factory method) 193 * is available to instantiate values from JSON Object 194 */ canCreateFromObjectWith()195 public boolean canCreateFromObjectWith() { return false; } 196 197 /** 198 * Method called to determine types of instantiation arguments 199 * to use when creating instances with creator arguments 200 * (when {@link #canCreateFromObjectWith()} returns true). 201 * These arguments are bound from JSON, using specified 202 * property types to locate deserializers. 203 *<p> 204 * NOTE: all properties will be of type 205 * {@link com.fasterxml.jackson.databind.deser.CreatorProperty}. 206 */ getFromObjectArguments(DeserializationConfig config)207 public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) { 208 return null; 209 } 210 211 /** 212 * Method that can be used to determine what is the type of delegate 213 * type to use, if any; if no delegates are used, will return null. 214 * If non-null type is returned, deserializer will bind JSON into 215 * specified type (using standard deserializer for that type), and 216 * pass that to instantiator. 217 */ getDelegateType(DeserializationConfig config)218 public JavaType getDelegateType(DeserializationConfig config) { return null; } 219 220 /** 221 * Method that can be used to determine what is the type of array delegate 222 * type to use, if any; if no delegates are used, will return null. If 223 * non-null type is returned, deserializer will bind JSON into specified 224 * type (using standard deserializer for that type), and pass that to 225 * instantiator. 226 * 227 * @since 2.7 228 */ getArrayDelegateType(DeserializationConfig config)229 public JavaType getArrayDelegateType(DeserializationConfig config) { return null; } 230 231 /* 232 /********************************************************** 233 /* Instantiation methods for JSON Object 234 /********************************************************** 235 */ 236 237 /** 238 * Method called to create value instance from a JSON value when 239 * no data needs to passed to creator (constructor, factory method); 240 * typically this will call the default constructor of the value object. 241 * It will only be used if more specific creator methods are not 242 * applicable; hence "default". 243 *<p> 244 * This method is called if {@link #getFromObjectArguments} returns 245 * null or empty List. 246 */ createUsingDefault(DeserializationContext ctxt)247 public Object createUsingDefault(DeserializationContext ctxt) throws IOException { 248 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 249 "no default no-arguments constructor found"); 250 } 251 252 /** 253 * Method called to create value instance from JSON Object when 254 * instantiation arguments are passed; this is done, for example when passing information 255 * specified with "Creator" annotations. 256 *<p> 257 * This method is called if {@link #getFromObjectArguments} returns 258 * a non-empty List of arguments. 259 */ createFromObjectWith(DeserializationContext ctxt, Object[] args)260 public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException { 261 // sanity check; shouldn't really get called if no Creator specified 262 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 263 "no creator with arguments specified"); 264 } 265 266 /** 267 * Method that delegates to 268 * {@link #createFromObjectWith(DeserializationContext, Object[])} by 269 * default, but can be overridden if the application should have customized 270 * behavior with respect to missing properties. 271 *<p> 272 * The default implementation of this method uses 273 * {@link PropertyValueBuffer#getParameters(SettableBeanProperty[])} to read 274 * and validate all properties in bulk, possibly substituting defaults for 275 * missing properties or throwing exceptions for missing properties. An 276 * overridden implementation of this method could, for example, use 277 * {@link PropertyValueBuffer#hasParameter(SettableBeanProperty)} and 278 * {@link PropertyValueBuffer#getParameter(SettableBeanProperty)} to safely 279 * read the present properties only, and to have some other behavior for the 280 * missing properties. 281 * 282 * @since 2.8 283 */ createFromObjectWith(DeserializationContext ctxt, SettableBeanProperty[] props, PropertyValueBuffer buffer)284 public Object createFromObjectWith(DeserializationContext ctxt, 285 SettableBeanProperty[] props, PropertyValueBuffer buffer) 286 throws IOException 287 { 288 return createFromObjectWith(ctxt, buffer.getParameters(props)); 289 } 290 291 /** 292 * Method to called to create value instance from JSON Object using 293 * an intermediate "delegate" value to pass to createor method 294 */ createUsingDelegate(DeserializationContext ctxt, Object delegate)295 public Object createUsingDelegate(DeserializationContext ctxt, Object delegate) throws IOException { 296 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 297 "no delegate creator specified"); 298 } 299 300 /** 301 * Method to called to create value instance from JSON Array using 302 * an intermediate "delegate" value to pass to createor method 303 */ createUsingArrayDelegate(DeserializationContext ctxt, Object delegate)304 public Object createUsingArrayDelegate(DeserializationContext ctxt, Object delegate) throws IOException { 305 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 306 "no array delegate creator specified"); 307 } 308 309 /* 310 /********************************************************** 311 /* Instantiation methods for JSON scalar types (String, Number, Boolean) 312 /********************************************************** 313 */ 314 createFromString(DeserializationContext ctxt, String value)315 public Object createFromString(DeserializationContext ctxt, String value) throws IOException { 316 return ctxt.handleMissingInstantiator(getValueClass(), this, ctxt.getParser(), 317 "no String-argument constructor/factory method to deserialize from String value ('%s')", 318 value); 319 320 } 321 createFromInt(DeserializationContext ctxt, int value)322 public Object createFromInt(DeserializationContext ctxt, int value) throws IOException { 323 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 324 "no int/Int-argument constructor/factory method to deserialize from Number value (%s)", 325 value); 326 } 327 createFromLong(DeserializationContext ctxt, long value)328 public Object createFromLong(DeserializationContext ctxt, long value) throws IOException { 329 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 330 "no long/Long-argument constructor/factory method to deserialize from Number value (%s)", 331 value); 332 } 333 createFromBigInteger(DeserializationContext ctxt, BigInteger value)334 public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException 335 { 336 return ctxt.handleMissingInstantiator(getValueClass(),this,null, 337 "no BigInteger-argument constructor/factory method to deserialize from Number value (%s)", 338 value 339 ); 340 } 341 createFromDouble(DeserializationContext ctxt, double value)342 public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException { 343 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 344 "no double/Double-argument constructor/factory method to deserialize from Number value (%s)", 345 value); 346 } 347 createFromBigDecimal(DeserializationContext ctxt, BigDecimal value)348 public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException 349 { 350 return ctxt.handleMissingInstantiator(getValueClass(),this,null, 351 "no BigDecimal/double/Double-argument constructor/factory method to deserialize from Number value (%s)", 352 value 353 ); 354 } 355 createFromBoolean(DeserializationContext ctxt, boolean value)356 public Object createFromBoolean(DeserializationContext ctxt, boolean value) throws IOException { 357 return ctxt.handleMissingInstantiator(getValueClass(), this, null, 358 "no boolean/Boolean-argument constructor/factory method to deserialize from boolean value (%s)", 359 value); 360 } 361 362 /* 363 /********************************************************** 364 /* Accessors for underlying creator objects (optional) 365 /********************************************************** 366 */ 367 368 /** 369 * Method that can be called to try to access member (constructor, 370 * static factory method) that is used as the "default creator" 371 * (creator that is called without arguments; typically default 372 * [zero-argument] constructor of the type). 373 * Note that implementations not required to return actual object 374 * they use (or, they may use some other instantiation) method. 375 * That is, even if {@link #canCreateUsingDefault()} returns true, 376 * this method may return null . 377 */ getDefaultCreator()378 public AnnotatedWithParams getDefaultCreator() { return null; } 379 380 /** 381 * Method that can be called to try to access member (constructor, 382 * static factory method) that is used as the "delegate creator". 383 * Note that implementations not required to return actual object 384 * they use (or, they may use some other instantiation) method. 385 * That is, even if {@link #canCreateUsingDelegate()} returns true, 386 * this method may return null . 387 */ getDelegateCreator()388 public AnnotatedWithParams getDelegateCreator() { return null; } 389 390 /** 391 * Method that can be called to try to access member (constructor, 392 * static factory method) that is used as the "array delegate creator". 393 * Note that implementations not required to return actual object 394 * they use (or, they may use some other instantiation) method. 395 * That is, even if {@link #canCreateUsingArrayDelegate()} returns true, 396 * this method may return null . 397 */ getArrayDelegateCreator()398 public AnnotatedWithParams getArrayDelegateCreator() { return null; } 399 400 /** 401 * Method that can be called to try to access member (constructor, 402 * static factory method) that is used as the "non-default creator" 403 * (constructor or factory method that takes one or more arguments). 404 * Note that implementations not required to return actual object 405 * they use (or, they may use some other instantiation) method. 406 * That is, even if {@link #canCreateFromObjectWith()} returns true, 407 * this method may return null . 408 */ getWithArgsCreator()409 public AnnotatedWithParams getWithArgsCreator() { return null; } 410 411 /* 412 /********************************************************** 413 /* Helper methods 414 /********************************************************** 415 */ 416 417 /** 418 * @since 2.4 (demoted from <code>StdValueInstantiator</code>) 419 * @deprecated Since 2.12 should not handle coercions here 420 */ 421 @Deprecated // since 2.12 _createFromStringFallbacks(DeserializationContext ctxt, String value)422 protected Object _createFromStringFallbacks(DeserializationContext ctxt, String value) 423 throws IOException 424 { 425 // also, empty Strings might be accepted as null Object... 426 if (value.length() == 0) { 427 if (ctxt.isEnabled(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)) { 428 return null; 429 } 430 } 431 432 /* 28-Sep-2011, tatu: Ok this is not clean at all; but since there are legacy 433 * systems that expect conversions in some cases, let's just add a minimal 434 * patch (note: same could conceivably be used for numbers too). 435 */ 436 if (canCreateFromBoolean()) { 437 // 29-May-2020, tatu: With 2.12 can and should use CoercionConfig so: 438 if (ctxt.findCoercionAction(LogicalType.Boolean, Boolean.class, 439 CoercionInputShape.String) == CoercionAction.TryConvert) { 440 String str = value.trim(); 441 if ("true".equals(str)) { 442 return createFromBoolean(ctxt, true); 443 } 444 if ("false".equals(str)) { 445 return createFromBoolean(ctxt, false); 446 } 447 } 448 } 449 return ctxt.handleMissingInstantiator(getValueClass(), this, ctxt.getParser(), 450 "no String-argument constructor/factory method to deserialize from String value ('%s')", 451 value); 452 } 453 454 /* 455 /********************************************************** 456 /* Standard Base implementation (since 2.8) 457 /********************************************************** 458 */ 459 460 /** 461 * Partial {@link ValueInstantiator} implementation that is strongly recommended 462 * to be used instead of directly extending {@link ValueInstantiator} itself. 463 */ 464 public static class Base extends ValueInstantiator 465 implements java.io.Serializable // just because used as base for "standard" variants 466 { 467 private static final long serialVersionUID = 1L; 468 469 protected final Class<?> _valueType; 470 Base(Class<?> type)471 public Base(Class<?> type) { 472 _valueType = type; 473 } 474 Base(JavaType type)475 public Base(JavaType type) { 476 _valueType = type.getRawClass(); 477 } 478 479 @Override getValueTypeDesc()480 public String getValueTypeDesc() { 481 return _valueType.getName(); 482 } 483 484 @Override getValueClass()485 public Class<?> getValueClass() { 486 return _valueType; 487 } 488 } 489 490 /** 491 * Delegating {@link ValueInstantiator} implementation meant as a base type 492 * that by default delegates methods to specified fallback instantiator. 493 * 494 * @since 2.12 495 */ 496 public static class Delegating extends ValueInstantiator 497 implements java.io.Serializable 498 { 499 private static final long serialVersionUID = 1L; 500 501 protected final ValueInstantiator _delegate; 502 Delegating(ValueInstantiator delegate)503 protected Delegating(ValueInstantiator delegate) { 504 _delegate = delegate; 505 } 506 507 @Override createContextual(DeserializationContext ctxt, BeanDescription beanDesc)508 public ValueInstantiator createContextual(DeserializationContext ctxt, BeanDescription beanDesc) 509 throws JsonMappingException 510 { 511 ValueInstantiator d = _delegate.createContextual(ctxt, beanDesc); 512 return (d == _delegate) ? this : new Delegating(d); 513 } 514 delegate()515 protected ValueInstantiator delegate() { return _delegate; } 516 517 @Override getValueClass()518 public Class<?> getValueClass() { return delegate().getValueClass(); } 519 520 @Override getValueTypeDesc()521 public String getValueTypeDesc() { return delegate().getValueTypeDesc(); } 522 523 @Override canInstantiate()524 public boolean canInstantiate() { return delegate().canInstantiate(); } 525 526 @Override canCreateFromString()527 public boolean canCreateFromString() { return delegate().canCreateFromString(); } 528 @Override canCreateFromInt()529 public boolean canCreateFromInt() { return delegate().canCreateFromInt(); } 530 @Override canCreateFromLong()531 public boolean canCreateFromLong() { return delegate().canCreateFromLong(); } 532 @Override canCreateFromDouble()533 public boolean canCreateFromDouble() { return delegate().canCreateFromDouble(); } 534 @Override canCreateFromBoolean()535 public boolean canCreateFromBoolean() { return delegate().canCreateFromBoolean(); } 536 @Override canCreateUsingDefault()537 public boolean canCreateUsingDefault() { return delegate().canCreateUsingDefault(); } 538 @Override canCreateUsingDelegate()539 public boolean canCreateUsingDelegate() { return delegate().canCreateUsingDelegate(); } 540 @Override canCreateUsingArrayDelegate()541 public boolean canCreateUsingArrayDelegate() { return delegate().canCreateUsingArrayDelegate(); } 542 @Override canCreateFromObjectWith()543 public boolean canCreateFromObjectWith() { return delegate().canCreateFromObjectWith(); } 544 545 @Override getFromObjectArguments(DeserializationConfig config)546 public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) { 547 return delegate().getFromObjectArguments(config); 548 } 549 550 @Override getDelegateType(DeserializationConfig config)551 public JavaType getDelegateType(DeserializationConfig config) { 552 return delegate().getDelegateType(config); 553 } 554 555 @Override getArrayDelegateType(DeserializationConfig config)556 public JavaType getArrayDelegateType(DeserializationConfig config) { 557 return delegate().getArrayDelegateType(config); 558 } 559 560 /* 561 /********************************************************** 562 /* Creation methods 563 /********************************************************** 564 */ 565 566 @Override createUsingDefault(DeserializationContext ctxt)567 public Object createUsingDefault(DeserializationContext ctxt) throws IOException { 568 return delegate().createUsingDefault(ctxt); 569 } 570 571 @Override createFromObjectWith(DeserializationContext ctxt, Object[] args)572 public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException { 573 return delegate().createFromObjectWith(ctxt, args); 574 } 575 576 @Override createFromObjectWith(DeserializationContext ctxt, SettableBeanProperty[] props, PropertyValueBuffer buffer)577 public Object createFromObjectWith(DeserializationContext ctxt, 578 SettableBeanProperty[] props, PropertyValueBuffer buffer) 579 throws IOException { 580 return delegate().createFromObjectWith(ctxt, props, buffer); 581 } 582 583 @Override createUsingDelegate(DeserializationContext ctxt, Object delegate)584 public Object createUsingDelegate(DeserializationContext ctxt, Object delegate) throws IOException { 585 return delegate().createUsingDelegate(ctxt, delegate); 586 } 587 588 @Override createUsingArrayDelegate(DeserializationContext ctxt, Object delegate)589 public Object createUsingArrayDelegate(DeserializationContext ctxt, Object delegate) throws IOException { 590 return delegate().createUsingArrayDelegate(ctxt, delegate); 591 } 592 593 @Override createFromString(DeserializationContext ctxt, String value)594 public Object createFromString(DeserializationContext ctxt, String value) throws IOException { 595 return delegate().createFromString(ctxt, value); 596 } 597 598 @Override createFromInt(DeserializationContext ctxt, int value)599 public Object createFromInt(DeserializationContext ctxt, int value) throws IOException { 600 return delegate().createFromInt(ctxt, value); 601 } 602 603 @Override createFromLong(DeserializationContext ctxt, long value)604 public Object createFromLong(DeserializationContext ctxt, long value) throws IOException { 605 return delegate().createFromLong(ctxt, value); 606 } 607 608 @Override createFromBigInteger(DeserializationContext ctxt, BigInteger value)609 public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException { 610 return delegate().createFromBigInteger(ctxt, value); 611 } 612 613 @Override createFromDouble(DeserializationContext ctxt, double value)614 public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException { 615 return delegate().createFromDouble(ctxt, value); 616 } 617 618 @Override createFromBigDecimal(DeserializationContext ctxt, BigDecimal value)619 public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException { 620 return delegate().createFromBigDecimal(ctxt, value); 621 } 622 623 @Override createFromBoolean(DeserializationContext ctxt, boolean value)624 public Object createFromBoolean(DeserializationContext ctxt, boolean value) throws IOException { 625 return delegate().createFromBoolean(ctxt, value); 626 } 627 628 /* 629 /********************************************************** 630 /* Accessors for underlying creator objects (optional) 631 /********************************************************** 632 */ 633 634 @Override getDefaultCreator()635 public AnnotatedWithParams getDefaultCreator() { return delegate().getDefaultCreator(); } 636 637 @Override getDelegateCreator()638 public AnnotatedWithParams getDelegateCreator() { return delegate().getDelegateCreator(); } 639 640 @Override getArrayDelegateCreator()641 public AnnotatedWithParams getArrayDelegateCreator() { return delegate().getArrayDelegateCreator(); } 642 643 @Override getWithArgsCreator()644 public AnnotatedWithParams getWithArgsCreator() { return delegate().getWithArgsCreator(); } 645 } 646 } 647