2015-08-02 3 views
1

Я пытаюсь добавить некоторый дополнительный код для каждого метода с помощью Java-агента. До сих пор я пишу код примерно так:Что такое чистый способ построения строк с помощью java-кода?

String signature = method.getSignature(); 
method.insertBefore("System.err.println(\"" + signature + "\");"); 

Есть ли более чистый способ написания синтаксиса Java? Было бы полезно что-то похожее на available for SQL.

Update: Например, чтобы создать System.err.println, что-то вроде createClass ("System") createField ("из") createMethod ("Println")...

ответ

1

Я считаю, что вы ищете String.format(String, Object...) и что-то вроде

method.insertBefore(String.format("System.err.println(\"%s\");", signature)); 
+0

что-то подобное, но, будучи в состоянии избавиться от уцелевших котировок будет лучше. – Arani

+1

Используйте одиночные кавычки (') или попробуйте выполнить экстернализацию, затем вы можете определить свои сообщения в текстовом файле, и вам не нужно скрывать кавычки. Внутри кода Java вам нужны. –

+0

@FlorianSchaetz Я понимаю, что вы говорите. Я ищу некоторую библиотеку утилиты, которая обрабатывает это для меня. Например, defineClass («System»). DefineField («out»). DefineFunction («println»). Что-то вроде этого будет полезно – Arani

1

Вы можете сделать это самостоятельно в качестве утилиты:

package ramin; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 
import com.google.common.base.Joiner; 

public class AraniUtil{ 

    private StringBuilder fullyQualifiedName = new StringBuilder("");//fully qualified name 

    /* 
    * Parameters : 
    * List classes : a list of classes to build in String type 
    * List fields : a list of fields to build in String type 
    * HashMap<String, List> methodsAndSignatures (or "mas") : a hashmap where maps method name to a list of arguments in String Type 
    */ 
    public AraniUtil(List classes, List fields, HashMap<String, List> mas) 
    { 
     //list of manipulated methods with their arguments 
     List methods = new ArrayList(); 
     Iterator iterator = mas.keySet().iterator();//method names iterator 
     for (Iterator i = iterator; iterator.hasNext();) { 

      Object next = i.next(); 
      StringBuilder mapped = new StringBuilder(""); 
      mapped.append((String) next); 


      Iterator signatures = mas.get(next).iterator(); 
      List tempSignature = new ArrayList(); 
      for (Iterator j = signatures; j.hasNext();) { 
       next = j.next(); 
       if (next.getClass().equals(String.class)) 
        //mapped.append("\"" + next + "\""); 
        tempSignature.add("\"" + next + "\""); 
       else 
        tempSignature.add(next); 
        //mapped.append(next); 
      } 
      mapped.append("(" + Joiner.on(",").join(tempSignature) + ")"); 
      methods.add(mapped.toString()); 
     } 
     fullyQualifiedName.append(Joiner.on(".").join(classes) + "."); 
     fullyQualifiedName.append(Joiner.on(".").join(fields) + "."); 
     fullyQualifiedName.append(Joiner.on(".").join(methods)); 
    } 

    @Override 
    public String toString(){ 
     return this.fullyQualifiedName.toString(); 
    } 

    public static void main(String[] args) { 
     //initializing classes to create 
     List classes = new ArrayList<String>(); 
     classes.add("System"); 
     classes.add("System2"); 
     //initializing fields to create 
     List fields = new ArrayList<String>(); 
     fields.add("out"); 
     fields.add("out2"); 
     HashMap methodsAndSignatures = new HashMap(); 
     //creating method signatures 
     List tempList = new ArrayList(); 
     tempList.add("arg1"); 
     tempList.add(6956); 
     //map a method to array of arguments 
     methodsAndSignatures.put("println", tempList); 
     //creating method signatures 
     List tempList2 = new ArrayList(); 
     tempList2.add("arg2"); 
     tempList2.add(6956555); 
     //map a method to array of arguments 
     methodsAndSignatures.put("println2", tempList2); 
     //actual utility function 
     AraniUtil araniUtil = new AraniUtil(classes, fields, methodsAndSignatures); 
     //and the result 
     System.out.println(araniUtil); 
    } 
} 

я написал это мой сам и поощрять своих друзей, чтобы реорганизовать/изменить его.

Это выводит System.System2.out.out2.println("arg1",6956).println("arg2",6956555)

Это отлично работает :)

Смежные вопросы