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分钟前
你想用它的名字实例化一个类?
首先,你需要创建一个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)
请确保您了解以下各项之间的差异:
如果需要,您还可以将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)
您描述的问题没有明确定义.转换是一种操作,它接受一个对象和一个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)
| 归档时间: |
|
| 查看次数: |
29179 次 |
| 最近记录: |