[jira] [Updated] (FELIX-4455) Missing default constructor creates invalid class instances
[ https://issues.apache.org/jira/browse/FELIX-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Benjamin Debeerst updated FELIX-4455: - 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 was: Consider the following component definition: {code} @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); } } {code} 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 {code} ComponentWithoutDefaultConstructor: activating! null {code} 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|https://github.com/BenjaminDebeerst/ipojo-component-constructor-sample], 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 > Missing default constructor creates invalid class instances > --- > > Key: FELIX-4455 > URL: https://issues.apache.org/jira/browse/FELIX-4455 > Project: Felix > Issue Type: Bug > Components: iPOJO >Affects Versions: ipojo-manipulator-1.10.1, ipojo-manipulator-1.11.1 >Reporter: Benjamin Debeerst > > 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.ou
[jira] [Updated] (FELIX-4455) Missing default constructor creates invalid class instances
[ https://issues.apache.org/jira/browse/FELIX-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Benjamin Debeerst updated FELIX-4455: - Description: Consider the following component definition: {code} @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); } } {code} 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 {code} ComponentWithoutDefaultConstructor: activating! null {code} 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|https://github.com/BenjaminDebeerst/ipojo-component-constructor-sample], 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 was: Consider the following component definition: {code} @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); } } {code} 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 {code} ComponentWithoutDefaultConstructor: activating! null {code} 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|https://github.com/BenjaminDebeerst/ipojo-component-constructor-sample], 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. > Missing default constructor creates invalid class instances > --- > > Key: FELIX-4455 > URL: https://issues.apache.org/jira/browse/FELIX-4455 > Project: Felix > Issue Type: Bug > Components: iPOJO >Affects Versions: ipojo-manipulator-1.10.1, ipojo-manipulator-1.11.1 >Reporter: Benjamin Debeerst > > Consider the following component definition: > {code} > @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