Benjamin Debeerst created FELIX-4455:
----------------------------------------
Summary: 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.11.1, ipojo-manipulator-1.10.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 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.
--
This message was sent by Atlassian JIRA
(v6.2#6252)