简单的问题,但是我花了一个多小时。我的代码如下。我需要使SomeClass sc动态化。因此,您将类名作为字符串传递给函数,并使用该类代替静态someClass。怎么做呢?

SomeClass sc;
if (someOtherClassObject instanceof SomeClass){
    sc=(SomeClass) someOtherClassObject;

我想要的是
public void castDynamic (String strClassName){
  //cast the classname referred by strClassName to SomeClass
  //if it is the  instance of SomeClass
}

编辑:
以上是简化。实际的代码是这个
public void X(String className, RequestInterface request)
{
    //My current code is this, I need to change so that "XRequest"
    //can be any   class referred by "className",
    //and "request.getRequest" the object belonging to "className" class
    //I don't want static XRequest xvr, it should be fetched dynamically

    XRequest xvr;
    if (request.getRequest() instanceof XRequest){
        xvr=(XRequest) request.getRequest();
        client.setRequest(xvr);
    }
}

另一个简单的改写:我使用request.getRequest()得到一个对象。我不知道那个物体是什么。因此,我需要将其强制转换为提供的类字符串名称。怎么做?就这样。 – SQC 13分钟前

最佳答案

您想通过名称实例化一个类吗?

首先,您需要创建一个Class<?>对象:

Class<?> cls = Class.forName(strClassName);

然后实例化它(注意,这会引发各种异常-访问冲突,ClassNotFound,没有参数的无公共(public)构造函数等)
Object instance = cls.newInstance();

然后可以将其转换为:
return (SomeClass) instance;

请确保您了解以下两者之间的区别:
  • 名称(近似文件名)
  • 对象(本质上是类型信息)
  • 实例(此类型的实际对象)

  • 如果需要,还可以将cls对象转换为Class<? extends SomeClass>类型。但是,它并不能给您太多。您可以内联它,以:
    return (SomeClass)(Class.forName(strClassName).newInstance());
    

    哦,但是您可以在实例化cls对象之前进行类型检查。因此,只有在它满足您的API(实现您要获取的接口(interface))的情况下,您才能实例化它。

    编辑:向反射添加更多示例代码。

    例如:
    if (cls.isInstance(request)) {
      // ...
    }
    

    对于调用方法,您需要知道可以转换为的接口(interface),或者使用反射(getMethod对象的cls方法):
    Method getRequest = cls.getMethod("getRequest");
    getRequest.invoke(request);
    

    10-07 19:16
    查看更多