Question

I want to get the byte code for a java method signature given MethodDeclaration object. I'm parsing the java class using Eclipse jdt and iterating over the MethodDeclaration like the following:

private static void processJavaFile(String javaFilePath) {
    List<MethodDeclaration> methodDeclarations = new ArrayList<MethodDeclaration>();
    FileInputStream reader = null;
    try {
        File javaFile = new File(javaFilePath);
        reader = new FileInputStream(javaFile);

        byte[] bs = new byte[reader.available()];
        reader.read(bs, 0, reader.available());
        String javaContent = new String(bs);

        CompilationUnit unit = ASTUtil.getCompilationUnit(javaContent, 4);
        MethodVisitor methodVisitor = new MethodVisitor();
        unit.accept(methodVisitor);
        methodDeclarations = methodVisitor.getMethods();
        for (MethodDeclaration methodDeclaration :methodDeclarations){
            ////////////////////////////////////////////////////////////////////////
            // ???? I want to get the byte code of the method signature here ???? //
            ////////////////////////////////////////////////////////////////////////
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

} 
Was it helpful?

Solution

The MethodDeclaration instance is part of the AST representing the syntax of the source code. It requires resolving the type names found in the source code before you can create a signature for a method.

for (MethodDeclaration methodDeclaration :methodDeclarations){
  // the next line requires that the project is setup correctly
  IMethodBinding resolved = methodDeclaration.resolveBinding();
  // then you can create a method signature
  ITypeBinding[] pType = resolved.getParameterTypes();
  String[] pTypeName=new String[pType.length];
  for(int ix = 0; ix < pType.length; ix++)
    pTypeName[ix]=pType[ix].getBinaryName().replace('.', '/');
  String rTypeName=resolved.getReturnType().getBinaryName().replace('.', '/');
  //org.eclipse.jdt.core.Signature
  String signature = Signature.createMethodSignature(pTypeName, rTypeName);
  System.out.println(signature);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top