26 Ağustos 2010 Perşembe

javap : (The Java Class File Disassembler)

Java da yazdığımız kodları JVM nin anlayabilmesi bytecodelara derlememiz gerekiyor.
ByteCode .java uzantılı dosyanın JVM üzereinde çalıştırılabilir hali olan .class isimli dosyadır.

javap komutunu test etmek için önce basit bir sınıf oluşturalım.

class TestLocalVariableNames {

String deneme;
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}

public String bMethod(int arg) {
for(int index=0;index<=5;index++){
int total = index+5;
}

return null;
}
}


bu sınıfı

terminalden

javac TestLocalVariableNames.java

diyerek derliyoruz . Daha sonra

javap TestLocalVariableNames

komutunu çalıştırarak java bytecodeları üzerinde disassembler işlemini yapıyor.

disassemble : Elimizdeki .class isimli derlenmiş dosyayı .java dosyasını ayrıştırılmış halini elde etmemize yarar.

javap sonucu Compiled from "TestLocalVariableNames.java"
class TestLocalVariableNames extends java.lang.Object{
java.lang.String deneme;
TestLocalVariableNames();
public java.lang.String aMethod(int);
public java.lang.String bMethod(int);
}


javap paramatereleri ne burdan ulaşabilirsiniz.


Ayrıca aşağıdaki metod ile java tarafında istediğinizi sınıfı disassemble edebilirsiniz.

public static List javap(Class clazz) {

List cachedInfo = new ArrayList();
BufferedReader bufferedReader = null;
try {
String classPath = System.getProperty("java.class.path");

Runtime runTime = Runtime.getRuntime();
Process javap = runTime.exec("javap -classpath \"" + classPath + "\" -l -c " + clazz.getName());
bufferedReader = new BufferedReader(new InputStreamReader(javap.getInputStream()));

if (bufferedReader != null) {

String line = bufferedReader.readLine();
while (line != null) {
cachedInfo.add(line);
line = bufferedReader.readLine();
}
}
} catch (Exception e) {
cachedInfo = null;
}
return cachedInfo;
}



Bunu dışında

com.sun.org.apache.bcel.internal.classfile.ClassParser
com.sun.org.apache.bcel.internal.classfile.JavaClass;

ile sınıfın metodlarına , paramatereleri ,değişkenlerine ulaşabilirsiniz.



1 yorum: