基于接口的类对象的类文字

时间:2015-11-20 03:09:59

标签: java generics

首先看起来看起来不太可能,所以听听一些设计模式或解决这个问题会很好。

我需要提供一个带有文字Class<T>的外部库,以便它找到正确的类型和注释并从dynamodb中提取。这是签名

public <T> T load(java.lang.Class<T> clazz, java.lang.Object hashKey)

但是在我的应用程序中,所需的类类型是动态的,并且从接口动态解析。

以下是我从界面动态解析类的全名的示例。

String dynamoDBTypeName = getDynamoDBClassName(someInterface);
Class<?> clazz = Class.forName(dynamoDBTypeName);

然后我需要将clazz转换为类文字,以便将其传递给

mapper.load(SomeClazz.class, hashKey)

我找不到关于如何将类对象转换为类文字的解决方案,因此我可以将实际类型传递给lib。有这样的吗?或者是否有更优雅的解决方案动态解析类文字的接口?

1 个答案:

答案 0 :(得分:1)

如果我正确地解释你的意图,那么你可以这样做:

String dynamoDBTypeName = getDynamoDBClassName(someInterface);
Class<?> clazz = Class.forName(dynamoDBTypeName);
Object loaded = mapper.load(clazz, hashKey);

无论是从Someclass.class还是从Class.forName(...)获取类,它都是相同的类对象。类型参数的值仅在编译时定义,因此传递给mapper.load的信息,实现mapper.load的代码或它返回的值绝对没有区别。

唯一的区别是,如果你将Class<X>传递给mapper.load(),那么编译器就知道它会返回一个X,你可以将它分配给X类型的变量而不进行强制转换。如果传递Class<?>,编译器只知道它将返回一个Object。它可以通过一些知道它应该是什么类型的代码强制转换为类的实例。