Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从字符串初始化类_Java_Reflection_Constructor - Fatal编程技术网

Java:从字符串初始化类

Java:从字符串初始化类,java,reflection,constructor,Java,Reflection,Constructor,假设我有一个名为ModelX的类,但我的程序直到运行时才知道这个类 因此,要创建它,我不能: private ModelX aModel; 因为它还不知道它的名字或者它的存在,所以它所做的唯一一件事就是从一个简单的.txt文件中读取它的名字 如何使它从字符串加载类,然后获取其构造函数,以便 String x = "ModelX"; cls = Class.forName("x"); Object obj = cls.newInstance(); aModel = new obj(); an

假设我有一个名为ModelX的类,但我的程序直到运行时才知道这个类

因此,要创建它,我不能:

private ModelX aModel;
因为它还不知道它的名字或者它的存在,所以它所做的唯一一件事就是从一个简单的.txt文件中读取它的名字

如何使它从字符串加载类,然后获取其构造函数,以便

String x = "ModelX";
cls = Class.forName("x");
Object obj = cls.newInstance();
aModel = new obj();

and

private obj aModel;
比如说,这样我就可以做到

String x = "ModelX";
cls = Class.forName("x");
Object obj = cls.newInstance();
aModel = new obj();

and

private obj aModel;
如果描述含糊不清,我很抱歉,但我真的不知道如何描述我想要的

我需要能够做到这一点:

aModel = new ModelX();
private ModelX aModel;

当我从字符串获取ModelX时。

首先,
Class.forName()
方法需要完全限定的类名。是类的简单名称,例如
ModelX
,附加到其包名之后,例如用
分隔

package com.example;

public class ModelX {...}
你会把它当作

Class clazz = Class.forName("com.example.ModelX");
其次,类
class
有一些方法来获取
构造函数
实例。如果您的
ModelX
类有一个可访问的no-args构造函数,您可以直接用

Object instance = clazz.newInstance();

你需要适当地施法

Java不允许您引用编译时未知的类型。因此,不可能写入

private ModelX aModel;
如果
ModelX
,则仅在运行时才知道

您有几种解决方法:

  • 您可以在相同的包中定义自己的
    ModelX
    ,该包具有所有相同的方法和接口,但具有纯存根实现。您可以安排在运行时引入真正的实现(例如,通过将存根编译成一个
    .class
    文件,该文件不会包含在最终的
    .jar
    中)。这就是Android所做的,例如,为Eclipse提供可浏览的Android类,这些类实际上只在设备上实现
  • 您可以定义一个名为类似的代理类(例如,
    ModelProxy
    ),该类实现所有相同的方法,通过反射将它们转发到运行时加载的类

    • 反射可按如下方式使用:

      String x = "com.example.ModelX";
      Class cls = Class.forName(x);
      Object obj = cls.newInstance();
      
      这可能也有帮助: