private static SourceSpec fieldFromString(String str) {
        str = str.trim();
        final int len = str.length();
        int i = 0;
        int start = i;
        while (!Character.isWhitespace(str.charAt(i)))
            i++;
        Type retTy = Type.forName(str.substring(start, i));

        start = i;
        i = str.lastIndexOf('.');
        Type declaringTy = Type.forName(str.substring(start, i).trim());
        start = ++i;
        String name = str.substring(start, len).trim();
        return new SourceSpec(Kind.FIELD, retTy, declaringTy, name, null);
    }
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