Uploaded image for project: 'Felix'
  1. Felix
  2. FELIX-4455

Missing default constructor creates invalid class instances

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Won't Fix
    • Affects Version/s: ipojo-manipulator-1.10.1, ipojo-manipulator-1.11.1
    • Fix Version/s: None
    • Component/s: iPOJO
    • Labels:
      None

      Description

      Consider the following component definition:

      @Component
      @Instantiate
      public class ComponentWithoutDefaultConstructor
      {
      private Object internal = new Object();

      @Property
      private String property;

      /* Constructor for unit tests */
      public ComponentWithoutDefaultConstructor(String property)

      { System.out.println("Non-default constructor call!"); this.property = property; }

      @Validate
      public void activate()

      { System.out.println("ComponentWithoutDefaultConstructor: activating!"); System.out.println(this.internal); }

      }

      As per definition, I would expect every instance of this class to have a non-null member internal at class creation. This is all fine for my unit tests in a non-OSGi environment.

      However, having this processes by iPOJO and putting this in an OSGi container, the component outputs

      ComponentWithoutDefaultConstructor: activating!
      null

      The existing non-default constructor is not called, while it seems that a separate constructor has been created that does non instantiate the member variable.

      If I extend the code by an empty default constructor, that one is called and all works perfectly fine.

      I have no idea how iPOJO creates the object instance anyways, as it should not be possible to create such an invalid object instance. I don't know much about the reflection APIs or byte code manipulation though.

      I have put a sample maven project on GitHub[1], which can be built and droppped into a fresh Karaf container + iPOJO, which shows the problem.

      If there is no constructor iPOJO can use, I would expect iPOJO to either A) throw a warning/error (and build or runtime) and fail to instantiate the component or B) synthesize the default constructor properly, including the implicit instantiation of member variables.

      I encountered this problem both with iPOJO 1.10.1 and 1.11.1.

      [1] https://github.com/BenjaminDebeerst/ipojo-component-constructor-sample

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              benjamindebeerst Benjamin Debeerst
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: