You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Benjamin Debeerst (JIRA)" <ji...@apache.org> on 2014/03/11 10:00:56 UTC

[jira] [Created] (FELIX-4455) Missing default constructor creates invalid class instances

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)