in dubbo-error-code-inspector/src/main/java/org/apache/dubbo/errorcode/extractor/JavassistConstantPoolErrorCodeExtractor.java [49:101]
public List<MethodDefinition> getIllegalLoggerMethodInvocations(String classFilePath) {
ClassFile classFile = JavassistUtils.openClassFile(classFilePath);
List<Object> constPoolItems = JavassistUtils.getConstPoolItems(classFile.getConstPool());
List<Integer> interfaceMethodRefIndices = constPoolItems.stream().filter(x -> {
try {
if (x == null) return false;
return x.getClass() == Class.forName("javassist.bytecode.InterfaceMethodrefInfo");
} catch (ClassNotFoundException e) {
return false;
}
}).map(this::getIndexFieldInConstPoolItems).collect(Collectors.toList());
List<MethodDefinition> methodDefinitions = new ArrayList<>();
for (int index : interfaceMethodRefIndices) {
ConstPool cp = classFile.getConstPool();
MethodDefinition methodDefinition = new MethodDefinition();
methodDefinition.setClassName(
cp.getInterfaceMethodrefClassName(index)
);
methodDefinition.setMethodName(
cp.getUtf8Info(
cp.getNameAndTypeName(
cp.getInterfaceMethodrefNameAndType(index)
)
)
);
methodDefinition.setArguments(
cp.getUtf8Info(
cp.getNameAndTypeDescriptor(
cp.getInterfaceMethodrefNameAndType(index)
)
)
);
methodDefinitions.add(methodDefinition);
}
Predicate<MethodDefinition> legacyLoggerClass = x -> x.getClassName().equals("org.apache.dubbo.common.logger.Logger");
Predicate<MethodDefinition> errorTypeAwareLoggerClass = x -> x.getClassName().equals("org.apache.dubbo.common.logger.ErrorTypeAwareLogger");
Predicate<MethodDefinition> loggerClass = legacyLoggerClass.or(errorTypeAwareLoggerClass);
return methodDefinitions.stream()
.filter(loggerClass)
.filter(x -> x.getMethodName().equals("warn") || x.getMethodName().equals("error"))
.filter(x -> x.getArguments().split(";").length < 4)
.collect(Collectors.toList());
}