使用 Class.forName() 初始化一个类,该类有一个带参数的构造函数

发布于 2024-11-01 04:31:44 字数 195 浏览 1 评论 0原文

我正在实例化一个这样的类。

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 constructor which takes arguments how can we instantiate it like above one.

Thanks,
Narendra

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云之铃。 2024-11-08 04:31:44

使用 Class.getConstructor() 并调用 Constructor.newInstance() 对此。例如,如果这是类 Foo 上的构造函数:

public Foo(String bar, int baz) {
}

您必须执行以下操作:

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

您必须知道需要将哪些参数传递给构造函数。如果这不合需要,您应该考虑使用一个空的构造函数。然后使用方法来设置通常传递给构造函数的内容。

有人可能会问你这里的模式是否正确。您真的需要使用反射吗?也许有更好的方法?如果您知道您已经要强制转换为对象,为什么不正常构建它呢?您可能需要提供更多背景信息来说明为什么需要这样做。有充分的理由,但你没有说明。

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.

忆悲凉 2024-11-08 04:31:44

newInstance() 始终调用默认构造函数。

如果你想调用参数化构造函数,

  1. 你必须通过传递 Class[] 来获取带有参数类型的构造函数
    for Class 的 getDeclaredConstructor 方法
  2. 您必须通过传递 Object[] for
    来创建构造函数实例
    构造函数的 newInstance() 方法

看一下示例代码。

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});

    }
}

输出:

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

查看 oracle 文档 页面了解更多详细信息。

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.

木槿暧夏七纪年 2024-11-08 04:31:44

如果您根据字符串“此处完全限定的类名”来选择要创建的对象类型,那么您很可能可以,并且应该将其替换为策略模式

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文