无法通过反射访问Scala私有val

时间:2017-03-19 23:46:52

标签: java scala reflection

Spark有BisectingKMeansModel这个root字段我想要它,但它没有曝光!我尝试通过反射得到它,但我得到了NoSuchFieldException

Field rootField = model.getClass().getDeclaredField("root");
rootField.setAccessible(true);
node = (ClusteringTreeNode) rootField.get(model);

我甚至尝试枚举字段:

for (Field f : model.getClass().getDeclaredFields()) {
    System.out.println(f.getName());
}

但它没有列出。我不熟悉Scala,这里发生了什么?

1 个答案:

答案 0 :(得分:0)

知道了 - root字段在包装类上。

ClusteringTreeNode node;    
try {
    Field parentField = model.getClass()
            .getDeclaredField("org$apache$spark$ml$clustering$BisectingKMeansModel$$parentModel");
    parentField.setAccessible(true);
    org.apache.spark.mllib.clustering.BisectingKMeansModel parentModel =
            (org.apache.spark.mllib.clustering.BisectingKMeansModel) parentField.get(model);
    Field rootField = parentModel.getClass().getDeclaredField("root");
    rootField.setAccessible(true);
    node = (ClusteringTreeNode) rootField.get(parentModel);
} catch (Exception e) {
    e.printStackTrace();
    return;
}

对于未来的googlers,至少在此问题得到修复之前:Spark BisectingKMeansModel层次结构树树形图