Create an Object from an Array Class

Discussion in 'Java' started by Z, Oct 30, 2007.

  1. Z

    Z Guest

    I am using reflection to getmethod(methodName, Class parameters) and
    invoke(object, obj[] parameters) methods from some Objects.

    My problem is:

    Say: I want to invoke a method that takes String[] object as parameter
    (I was able to getmethod correctly). When I try to create an object
    (to pass as args to invoke):

    Object someObject= (Object) String[].class.newInstance();

    (Note that the object is not always an instance of String[]... it
    could be an instance of SomeOtherClass[])

    I do get the following exception:

    java.lang.InstantiationException: [Ljava.lang.String;

    My question is:

    Does the "[L" at the beginning and the ";" at the end have a meaning?
    How can I solve this problem?

    I am using IntelliJ 6.0.5.

    Thanks in advance.
     
    Z, Oct 30, 2007
    #1
    1. Advertising

  2. Z wrote:
    > I am using reflection to getmethod(methodName, Class parameters) and
    > invoke(object, obj[] parameters) methods from some Objects.
    >
    > My problem is:
    >
    > Say: I want to invoke a method that takes String[] object as parameter
    > (I was able to getmethod correctly). When I try to create an object
    > (to pass as args to invoke):
    >
    > Object someObject= (Object) String[].class.newInstance();
    >
    > (Note that the object is not always an instance of String[]... it
    > could be an instance of SomeOtherClass[])


    RTFM:
    [ From Class.newInstance(): ]
    Throws:
    [ ... ]
    InstantiationException - if this Class represents an abstract
    class, an interface, an array class, a primitive type, or void; or if
    the class has no nullary constructor; or if the instantiation fails for
    some other reason.
    [ ... ]

    Arrays cannot be created with a new instance, because they are a
    special-case class.

    > My question is:
    >
    > Does the "[L" at the beginning and the ";" at the end have a meaning?


    Yes, this is the internal representation of the class (it means that
    this is an array of java.lang.String's).

    > How can I solve this problem?


    What you are probable intending is something like this:

    Method m = Class.forName("some.pkg.Type").getMethod("main",
    String[].class);
    m.invoke(null, new String[0]);

    > I am using IntelliJ 6.0.5.


    Java version matters, not IDE version.

    --
    Beware of bugs in the above code; I have only proved it correct, not
    tried it. -- Donald E. Knuth
     
    Joshua Cranmer, Oct 30, 2007
    #2
    1. Advertising

  3. Joshua Cranmer wrote:
    > What you are probable intending is something like this:
    >
    > Method m = Class.forName("some.pkg.Type").getMethod("main",
    > String[].class);
    > m.invoke(null, new String[0]);


    If the type of array must be determined at runtime, the following idiom
    can also be used:

    // arrayType is a class representing the type we want.
    Object array = Array.newInstance(arrayType, 0); // Empty array

    Array has another overloaded version that handles multiple array dimensions.

    --
    Beware of bugs in the above code; I have only proved it correct, not
    tried it. -- Donald E. Knuth
     
    Joshua Cranmer, Oct 30, 2007
    #3
  4. Z

    Z Guest

    Thanks for the clarifications. I hope that my phrasing of the question
    shows where I am stuck.

    What I am intending to do is:

    //here is how my program is flowing

    String className = namesOfAllClasses[j]; //I have it coming through a
    loop

    Class class1 = Class.forName(className);

    Fields fields = class1.getDeclaredFields(); //assuming that all fields
    are Class type (not primitive)

    for (int i=0; i < fields.length; i++) {
    Class newClass = Class.forName(fields.getType().getName()); //
    create a class of the field type
    Object newObject = newClass.newInstance(); //create an object of
    the new field type
    Method m = newClass.getMethod(methodName, newClass); /*get method;
    we can assume it's "set"+fields.getName()*/
    Object arguments[] = {"dummy"};
    m.invoke(newObject, arguments);
    }

    /*
    When a field is someClass[], I am facing troubles since now the
    fields.getType().getName() = L[some.pkg.name.someClass;
    In this case:
    Class newClass = Class.forName(fields.getType().getName()) is
    returning with a result (no exceptions)

    But using the newInstance is generating exceptions since it's a
    special-case class as you explained.

    You have used
    m.invoke(null, new String[0]); //it gave me back a
    nullPointerRxception even though it's a static method

    My problem is that the second parameter in invoke does not have to be
    a String type for the parameter object but is an object instance of
    the L[some.pkg.name.someClass; (object array)

    Example: This method looks like this in ClassName.java

    public void setsomeObjectProperty(some.pkg.name.someClass[]
    someObjectProperty) {
    this.someObjectProperty= someObjectProperty;
    }

    Any tips?
    */

    Thanks again for your time


    On Oct 30, 5:53 pm, Joshua Cranmer <> wrote:
    > Z wrote:
    > > I am using reflection to getmethod(methodName, Class parameters) and
    > > invoke(object, obj[] parameters) methods from some Objects.

    >
    > > My problem is:

    >
    > > Say: I want to invoke a method that takes String[] object as parameter
    > > (I was able to getmethod correctly). When I try to create an object
    > > (to pass as args to invoke):

    >
    > > Object someObject= (Object) String[].class.newInstance();

    >
    > > (Note that the object is not always an instance of String[]... it
    > > could be an instance of SomeOtherClass[])

    >
    > RTFM:
    > [ From Class.newInstance(): ]
    > Throws:
    > [ ... ]
    > InstantiationException - if this Class represents an abstract
    > class, an interface, an array class, a primitive type, or void; or if
    > the class has no nullary constructor; or if the instantiation fails for
    > some other reason.
    > [ ... ]
    >
    > Arrays cannot be created with a new instance, because they are a
    > special-case class.
    >
    > > My question is:

    >
    > > Does the "[L" at the beginning and the ";" at the end have a meaning?

    >
    > Yes, this is the internal representation of the class (it means that
    > this is an array of java.lang.String's).
    >
    > > How can I solve this problem?

    >
    > What you are probable intending is something like this:
    >
    > Method m = Class.forName("some.pkg.Type").getMethod("main",
    > String[].class);
    > m.invoke(null, new String[0]);
    >
    > > I am using IntelliJ 6.0.5.

    >
    > Java version matters, not IDE version.
    >
    > --
    > Beware of bugs in the above code; I have only proved it correct, not
    > tried it. -- Donald E. Knuth
     
    Z, Oct 30, 2007
    #4
  5. Z <> writes:

    > I am using reflection to getmethod(methodName, Class parameters) and
    > invoke(object, obj[] parameters) methods from some Objects.
    >
    > My problem is:
    >
    > Say: I want to invoke a method that takes String[] object as parameter
    > (I was able to getmethod correctly). When I try to create an object
    > (to pass as args to invoke):
    >
    > Object someObject= (Object) String[].class.newInstance();


    That fails, because the array class does not have a normal
    constructor. Here you try to invoke a default constructor.

    > (Note that the object is not always an instance of String[]... it
    > could be an instance of SomeOtherClass[])
    >
    > I do get the following exception:
    >


    > java.lang.InstantiationException: [Ljava.lang.String;


    > My question is:
    >
    > Does the "[L" at the beginning and the ";" at the end have a meaning?


    Yes. Java writes the name of and array of object type as "[L" followed
    by the name of the class and ended by ";". I.e., the type
    my.foo.Foo[]
    has the name "[Lmy.foo.Foo;". Arrays of base types have other abbreviations,
    e.g., "[I" for int[].

    > How can I solve this problem?


    Array.newInstance(String.class, 0); // equivalent to: new String[0]

    /L
    --
    Lasse Reichstein Nielsen -
    DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
    'Faith without judgement merely degrades the spirit divine.'
     
    Lasse Reichstein Nielsen, Oct 31, 2007
    #5
  6. Z

    Daniel Pitts Guest

    Z wrote:
    > On Oct 30, 5:53 pm, Joshua Cranmer <> wrote:
    >> Z wrote:
    >>> I am using reflection to getmethod(methodName, Class parameters) and
    >>> invoke(object, obj[] parameters) methods from some Objects.
    >>> My problem is:
    >>> Say: I want to invoke a method that takes String[] object as parameter
    >>> (I was able to getmethod correctly). When I try to create an object
    >>> (to pass as args to invoke):
    >>> Object someObject= (Object) String[].class.newInstance();
    >>> (Note that the object is not always an instance of String[]... it
    >>> could be an instance of SomeOtherClass[])

    >> RTFM:
    >> [ From Class.newInstance(): ]
    >> Throws:
    >> [ ... ]
    >> InstantiationException - if this Class represents an abstract
    >> class, an interface, an array class, a primitive type, or void; or if
    >> the class has no nullary constructor; or if the instantiation fails for
    >> some other reason.
    >> [ ... ]
    >>
    >> Arrays cannot be created with a new instance, because they are a
    >> special-case class.
    >>
    >>> My question is:
    >>> Does the "[L" at the beginning and the ";" at the end have a meaning?

    >> Yes, this is the internal representation of the class (it means that
    >> this is an array of java.lang.String's).
    >>
    >>> How can I solve this problem?

    >> What you are probable intending is something like this:
    >>
    >> Method m = Class.forName("some.pkg.Type").getMethod("main",
    >> String[].class);
    >> m.invoke(null, new String[0]);
    >>
    >>> I am using IntelliJ 6.0.5.

    >> Java version matters, not IDE version.
    >>
    >> --
    >> Beware of bugs in the above code; I have only proved it correct, not
    >> tried it. -- Donald E. Knuth

    > Thanks for the clarifications. I hope that my phrasing of the question
    > shows where I am stuck.
    >
    > What I am intending to do is:
    >
    > //here is how my program is flowing
    >
    > String className = namesOfAllClasses[j]; //I have it coming through a
    > loop
    >
    > Class class1 = Class.forName(className);
    >
    > Fields fields = class1.getDeclaredFields(); //assuming that all fields
    > are Class type (not primitive)
    >
    > for (int i=0; i < fields.length; i++) {
    > Class newClass = Class.forName(fields.getType().getName()); //
    > create a class of the field type
    > Object newObject = newClass.newInstance(); //create an object of
    > the new field type
    > Method m = newClass.getMethod(methodName, newClass); /*get method;
    > we can assume it's "set"+fields.getName()*/
    > Object arguments[] = {"dummy"};
    > m.invoke(newObject, arguments);
    > }
    >
    > /*
    > When a field is someClass[], I am facing troubles since now the
    > fields.getType().getName() = L[some.pkg.name.someClass;
    > In this case:
    > Class newClass = Class.forName(fields.getType().getName()) is
    > returning with a result (no exceptions)
    >
    > But using the newInstance is generating exceptions since it's a
    > special-case class as you explained.
    >
    > You have used
    > m.invoke(null, new String[0]); //it gave me back a
    > nullPointerRxception even though it's a static method
    >
    > My problem is that the second parameter in invoke does not have to be
    > a String type for the parameter object but is an object instance of
    > the L[some.pkg.name.someClass; (object array)
    >
    > Example: This method looks like this in ClassName.java
    >
    > public void setsomeObjectProperty(some.pkg.name.someClass[]
    > someObjectProperty) {
    > this.someObjectProperty= someObjectProperty;
    > }
    >
    > Any tips?
    > */
    >
    > Thanks again for your time
    >
    >

    First, please don't top-post. Reply after the bottom or interleaved.

    Second, Don't look for set+name or get+name methods. Use the
    introspection API. (java.beans.*). There is more to JavaBeans than just
    a naming convention.

    Also, ask yourself if you REALLY need to use reflection/introspection at
    all. I wrote an article about it on my blog sometime last year
    <http://virtualinfinity.net/wordpress/>

    I'll post the exact link when I have a chance to look it up.

    --
    Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
     
    Daniel Pitts, Oct 31, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. E11
    Replies:
    1
    Views:
    4,902
    Thomas Weidenfeller
    Oct 12, 2005
  2. Piotre Ugrumov
    Replies:
    7
    Views:
    407
    Lefteris Laskaridis
    Jan 11, 2004
  3. Replies:
    9
    Views:
    588
    justanotherguy
    Dec 3, 2004
  4. jon wayne
    Replies:
    9
    Views:
    732
    Jim Langston
    Sep 22, 2005
  5. Replies:
    1
    Views:
    1,150
    James Kanze
    Jun 30, 2008
Loading...

Share This Page