非常简单的Java动态强制转换

SQC*_*SQC 5 java casting dynamic

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

SomeClass sc;
if (someOtherClassObject instanceof SomeClass){
    sc=(SomeClass) someOtherClassObject;
Run Code Online (Sandbox Code Playgroud)

我想要的是

public void castDynamic (String strClassName){
  //cast the classname referred by strClassName to SomeClass 
  //if it is the  instance of SomeClass
}
Run Code Online (Sandbox Code Playgroud)

编辑:以上是简化.实际的代码就是这个

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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个简单的改述:我使用request.getRequest()获取一个对象.我不知道那个对象是什么.所以我需要将它强制转换为提供的类字符串名称.怎么做?就这样. - SQC 13分钟前

Ano*_*sse 7

你想用它的名字实例化一个类?

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

Class<?> cls = Class.forName(strClassName);
Run Code Online (Sandbox Code Playgroud)

然后实例化这个(注意,这可能引发各种异常-访问冲突,ClassNotFound没有公共构造不带参数等)

Object instance = cls.newInstance();
Run Code Online (Sandbox Code Playgroud)

然后你可以施展它:

return (SomeClass) instance;
Run Code Online (Sandbox Code Playgroud)

请确保您了解以下各项之间的差异:

  1. (大约是文件名)
  2. 对象(本质上是类型信息)
  3. 实例(此类型的实际对象)

如果需要,您还可以将cls对象强制转换为类型Class<? extends SomeClass>.但是,它并没有给你太多.你可以将它内联到:

return (SomeClass)(Class.forName(strClassName).newInstance());
Run Code Online (Sandbox Code Playgroud)

哦,但你可以cls在实例化之前用对象进行类型检查.因此,如果它满足您的API(实现您想要获得的接口),您只需实例化它.

编辑:添加进一步的示例代码,反思.

例如:

if (cls.isInstance(request)) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

对于调用方法,您需要知道可以强制转换的接口,或者使用反射(对象的getMethod方法cls):

Method getRequest = cls.getMethod("getRequest");
getRequest.invoke(request);
Run Code Online (Sandbox Code Playgroud)


Ita*_*man 7

您描述的问题没有明确定义.转换是一种操作,它接受一个对象和一个Class,然后检查该对象是否是给定类的实例.

但是你说你需要一些东西cast(s) the classname referred by strClassName to SomeClass if it is the instance of SomeClass.换句话说,你正在寻找适用于两个类(而不是类和对象)的东西.

所以,我们需要重申这个问题.这里有三个可能的问题(+解决方案)我希望其中一个是你需要的

// Problem 1: check whether "object" can be casted to the class 
// whose name is "className"
public void castDynamic(Object object, String className) {
  Class cls = Class.forName(className);
  cls.cast(object);
}

// Problem 2: check whether the class whose name is "className" 
// is a subclass of SomeClass (A is a subclass of B if A (transitively) 
// extends or implements B).
public void castDynamic(String className) {
  Class cls = Class.forName(className);
  SomeClass.class.asSubclass(cls);
}


// Problem 3: check whether SomeClass is a sublcass the class 
// whose name is "className"
public void castDynamic(String className) {
  Class cls = Class.forName(className);
  cls.asSubclass(SomeClass.class);
}
Run Code Online (Sandbox Code Playgroud)

完整详情:http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#asSubclass(java.lang.Class)