简单的问题,但是我花了一个多小时。我的代码如下。我需要使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);