非常简单的Java动态转换

5

这是一个简单的问题,但我已经花了一个多小时来解决。我的代码如下所示。我需要使SomeClass sc成为动态的。因此,您可以在函数中传递类名作为字符串,并在静态someClass的位置使用该类。如何处理?

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

What I want is

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分钟前

2
也许你应该在问题中描述你想要的结果。根据字符串创建类的实例与动态转换无关。你是想根据字符串类名创建已知类的实例,还是想根据字符串类名创建任何类的实例? - DwB
我正在创建一个API调用,它接收类名和一个相同类名的对象。在方法中,我需要将对象强制转换为类名(但记住,我只有类名的字符串,而不是真正的类)。就这样。很简单。 - SQC
正确的方法是将该方法放入“RequestInterface”中,然后您可以轻松调用它。除此之外,您需要使用反射来检索要调用的方法。 - Has QUIT--Anony-Mousse
3个回答

8

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

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

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

接下来实例化这个对象(注意,这可能会抛出各种异常-访问违规,ClassNotFound,没有无参的public构造函数等)

Object instance = cls.newInstance();

然后您可以将其投射:
return (SomeClass) instance;

请确保您理解以下内容的区别:
  1. 类名(大约相当于文件名)
  2. 类对象(基本上是一种类型信息)
  3. 类实例(该类型的实际对象)
如果需要,您还可以将cls对象转换为具有类型Class 。但这并没有给你太多东西。您还可以内联它:
return (SomeClass)(Class.forName(strClassName).newInstance());

哦,但是您可以使用cls对象进行类型检查,然后再实例化它。因此,只有在满足您的API(实现您想要获取的接口)时才实例化它。

编辑:添加更多关于反射的示例代码。

例如:

if (cls.isInstance(request)) {
  // ...
}

如果要调用方法,您需要知道一个可以转换的接口,或使用反射(cls对象的getMethod方法):

Method getRequest = cls.getMethod("getRequest");
getRequest.invoke(request);

同样有效:cls.isInstance(request) - Has QUIT--Anony-Mousse

7
您描述的问题并不明确。 转换是一个操作,它接收一个对象和一个类,然后检查该对象是否是给定类的实例。
但是您说需要一些东西“如果它是SomeClass的实例,则将strClassName所引用的类名转换为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);
}

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

这段内容讲的是Java中的asSubclass()方法,该方法可以将一个类对象转换为另一个类对象的子类。具体使用细节可以参考上方提供的链接。

谢谢。请查看我的原始问题和其中的评论,了解我想要什么。 - SQC

1

你的意思是?

 Class clazz = Class.forName(strClassName);

错误是由下面两行转换引起的。您会如何编写“if(){}”部分的代码? - SQC
你的最终目标是什么?当你这样转换对象时,是因为你需要使用该类的实例来做某些事情。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接