开发者

Initializing a class with Class.forName() and which have a constructor which takes arguments

开发者 https://www.devze.com 2023-02-24 22:34 出处:网络
I am instantiating a class like this. myObj = (myObj) Class.forName(\"fully qualified class name here\").newInstance();

I am instantiating a class like this.

myObj = (myObj) Class.forName("fully qualified class name here").newInstance();

My doubt here is if we have a con开发者_JAVA技巧structor which takes arguments how can we instantiate it like above one.

Thanks,

Narendra


Use Class.getConstructor() and call Constructor.newInstance() on that. For example if this is your constructor on class Foo:

public Foo(String bar, int baz) {
}

You'd have to do something like this:

Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE);
Foo foo = (Foo) c.newInstance("example", 34);

You'll have to know what arguments need to be passed to the constructor. If that's not desirable you should consider having an empty constructor. Then have methods to set what you'd normally pass into the constructor.

One might ask if you have the right pattern here though. Do you really need to use reflection, perhaps there's a better approach? If you know you're going to be casting to your object already, why not just construct it normally? You might want to provide more context as to why you need to do this. There are valid reasons, however you haven't stated any.


newInstance() always invokes default constructor.

if you want to invoke parametrized constructor,

  1. You have to get Constructor with parameter types by passing Class[] for getDeclaredConstructor method of Class
  2. You have to create constructor instance by passing Object[] for
    newInstance() method of Constructor

Have a look at example code.

import java.lang.reflect.*;

class NewInstanceDemo{
    public NewInstanceDemo(){
        System.out.println("Default constructor");
    }
    public NewInstanceDemo(int a, long b){
        System.out.println("Two parameter constructor : int,long => "+a+":"+b);
    }
    public NewInstanceDemo( int a, long b, String c){
        System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c);
    }
    public static void main(String args[]) throws Exception {

        NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance();
        Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class});
        NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2});

    }
}

output:

java NewInstanceDemo
Default constructor
Two parameter constructor : int,long => 1:2

Have a look at oracle documentation page for more details.


If you are choosing type of object to create depending on string "fully qualified class name here" it's most likely you can and you should replace it with Strategy pattern.

0

精彩评论

暂无评论...
验证码 换一张
取 消