private static void checkFieldSource(String source) {
        String returnTypeEx = "\\s*(boolean|byte|char|double|float|int|long|short|void|([A-Za-z0-9_$]+\\.)*[A-Za-z0-9_$]+)(\\[\\])?";
        String declaringEx = "([A-Za-z0-9_$]+\\.)*[A-Za-z0-9_$]+\\.[A-Za-z0-9_$]+";

        String validField = "A valid field expression should be [fieldType packageName.className.fieldName]";
        if (!source.matches(returnTypeEx + "\\s+" + declaringEx)) {
            String reason;
            {
                Pattern pattern = Pattern.compile(returnTypeEx + "\\s+");
                Matcher matcher = pattern.matcher(source);
                boolean hasReturnTypeEx = matcher.find();
                if (!hasReturnTypeEx) {
                    reason = "Type for the filed is missing";
                    throwBadStatementException("Invalid java field expression: [" + source + "], " +
                            "reason: " + reason + ", " + validField);
                }
            }
            throwBadStatementException("Invalid java field expression: [" + source + "]" + ", " + validField);
        }
    }
This is a parser for custom aop pointcut expression.
<p>
Such as <pre>int android.util.Log.d(java.lang.String,java.lang.String)</pre>
plugin/src/main/groovy/com/didichuxing/tools/droidassist/spec/SourceSpec.java