业务场景:
业务做的是Java-agent监控的项目,某top2中间件团队。
需要给用户的spring-data-mongodb里面的org.springframework.data.mongodb.core.MongoTemplate这个类做埋点,监控其他Java应用项目调用该类的增删改查方法的链路。
其中业务要求做到兼容某顶级客户的低版本1.x和市面上常见的3.x这两种。
监控代码中需要调用2两个版本里面的hostport数据。
如果直接用 xx.get方法时肯定会遇到飘红,3.x包下的方法可以用,1.x的引用不了。这个时候我们都使用反射去取hostport就不存在业务飘红的情况,就解决了该冲突。由于内部代码具有一定的机密性,现贴出一小段抛砖引玉:` Object mongoTemplateObject = ((MongoTemplate) target);DB db = (DB)methodGetDb.invoke(mongoTemplateObject);
Method methodMongo = db.getClass().getMethod("getMongo");
Mongo mongo = (Mongo)methodMongo.invoke(db);
Field clusterField = mongo.getClass().getSuperclass().getDeclaredField("cluster");
clusterField.setAccessible(true);
Cluster cluster = (Cluster) clusterField.get(mongo);
ClusterSettings settings = cluster.getSettings();`