将任何Class作为方法的参数传递



这可能以前有人问过,我也看到过一些类似的问题,但不太理解。

在Java中,如何使方法接受任何类作为参数?

例如,

public (AnyClass) myMethod(String whatever, (AnyClass) thisClass){
}

像一样使用

myMethod("Hello", ClassA);
myMethod("Hello", ClassB);

谢谢你的帮助!

编辑:

要求提供用法示例;我正在做的是将一个JSON字符串映射到一个POJO,但试图将整个内容抽象出来,以便重用。所以——我需要能够通过任何类和JSON字符串(或HttpConn),然后构建,然后使用Jackson构建POJO并返回对象,无论是什么类型。

(我想做什么的想法):

public Class<?> doSomething(String jsonString, Class<?> clazz){
clazz newInstance = mapper.readValue(jsonString, clazz);
return clazz;
}

称为:

ClassA test = doSomething("String One", ClassA.class);
ClassB testTwo = doSomething("Different format string", ClassB.class);

希望这有助于理解问题。。。以及我对解决方案的理解!

1)没有类型信息:

public static Class<?> myMethod(String text, Class<?> clazz) {
// body
return clazz;
}

客户代码:

public static void main(String[] args) {
Class<?> clss = myMethod("Example", String.class);
}

2) 带类型信息:

public static <T> Class<T> myMethod(String x, Class<T> clazz) {
// body
return clazz;
}

客户代码:

public static void main(String[] args) {
Class<String> clsStr = myMethod("Example", String.class);
Class<?> clsAny = myMethod("Example", String.class);
}

3) 原始类型(有效,但不推荐):

public static Class myMethod(String x, Class clazz) {
// body
return clazz;
}

客户代码:

public static void main(String[] args) {
Class<String> clsStr = myMethod("Example", String.class); // warning for Unchecked Assignment 
Class<?> clsAny = myMethod("Example", String.class);
Class clsRaw = myMethod("Example", String.class);
}

4) 具有在类级别定义的类型信息:

public class Main<T> { 
// cannot be static
public Class<T> myMethod(String x, Class<T> clazz) {
// body
return clazz;
}
}

客户代码:

public static void main(String[] args) {
Main<String> m = new Main<>();
Class<String> cls = m.myMethod("x", String.class);
}

我假设您需要接受某种类型的T类作为参数,并返回该类。在这种情况下,您的方法签名将是这样的:

public <T> Class<T> myMethod(String whatever, Class<T> clazz){
// put the rest of your code here
}

在您最近的编辑中,您的使用示例如下:

ClassA test = doSomething("String One", ClassA.class);

这个问题显示了类名、class对象和类实例之间的混淆。为了澄清,使用上面的例子:

  • 类名ClassA用于声明变量。

  • 类实例ClassA.class是一个单例对象,它包含有关类的信息,可以作为参数传递给方法。

  • 类的实例test是一个对象。它通常使用new关键字创建。

不能在声明中直接使用Class对象,如ClassA.class。相反,您必须调用Class类的newInstance()方法。只有当您的类具有无参数构造函数时,才能使用该方法。要创建一个带有构造函数参数的实例,请使用以下内容:

public <T> T doSomething(String jsonString, Class<T> clazz) throws ReflectiveOperationException {
Constructor<T> constructor = clazz.getConstructor(String.class);
return constructor.newInstance(jsonString);
}

上面的方法使用构造函数创建所需类的实例,该构造函数接受String(传入的字符串)。根据您的要求更改其主体以创建实例。

最新更新