我想使用反射加载的类来初始化KafkaConsumer泛型类型。这些类将通过avro-tools生成,并将扩展SpecificRecordBase类。我知道,我可以用通配符做一些事情-
KafkaConsumer<? extends SpecificRecordBase, ? extends SpecificRecordBase> consumer = new KafkaConsumer<>(properties);但是,我要找的是-
Class keyClass = Class.forName("com.test.KeyClass");
Class valueClass = Class.forName("com.test.ValueClass");
KafkaConsumer<keyClass, valueClass> consumer = new KafkaConsumer<>(properties);如有任何建议,我们将不胜感激。谢谢。
发布于 2020-12-29 21:59:29
由于类型参数的存在只是为了方便程序员,在运行时它们将被擦除,因此,通过反射加载它们是没有意义的。
但是,你可以将它转换为所需的类型,例如
Consumer<KeyClass, ValueClass> consumer = new KafkaConsumer<>(properties);发布于 2020-12-31 19:36:46
我不确定,但以下内容是否满足您的要求--
public Consumer<?,?> getConsumer(Class<?> keyClass,Class<?> valClass,
Properties props){
props.put(deserializer properties of keyClass);
props.put(deserializer properties of valClass);
//other releavant props
return new KafkaConsumer<>(props);
}
..
caller(){
Class<?> keyClass=Class.forName("KeyClass");
Class<?> valClass=Class.forName("ValClass");
KafkaConsumer<?,?> con=(KafkaConsumer<?,?>)getConsumer(keyClass,valClass,props);
} 发布于 2021-01-01 09:52:25
设置一个单独的任务来构建和发布schema jar (我建议将它们放在一个单独的repo中,并使用它自己的构建)。然后通过Gradle/Maven拉入依赖项,您将拥有实际的类型,而反射应该不是必需的。
https://stackoverflow.com/questions/65410694
复制相似问题