2012-05-18 23 views
5

Basit bir java ajan yazmak istiyorum java programın enstrüman tarafından denilen bir yöntemin adını yazdırabilirsiniz.Java yöntemleri nasıl oluşturulur?

Örneğin, ben enstrüman istiyorum benim java programı:

public class TestInstr { 

public static void sayHello() { 
    System.out.println("Hello !"); 
} 

public static void main(String args[]) { 
    sayHello(); 
    sayHello(); 
    sayHello(); 
} 

} 

Böyle bir şey göstermek istiyorum: Yardımlarınız için

method sayHello has been called 
Hello ! 
method sayHello has been called 
Hello ! 
method sayHello has been called 
Hello ! 

Teşekkür!

+0

http://stackoverflow.com/questions/10562769/record-every-method-execution –

cevap

1

yöntemde size

public class TestInstr { 

public static void sayHello() { 
System.out.println("method sayHello has been called"); 
System.out.println("Hello !"); 
} 

public static void main(String args[]) { 
sayHello(); 
sayHello(); 
sayHello(); 
} 
} 

Bu aradığınız buysa emin değilim geçerli yöntemini

public String getCurrentMethodName() { 
StackTraceElement stackTraceElements[] = 
     (new Throwable()).getStackTrace(); 
return stackTraceElements[1].toString(); 
} 

almak için kullanabiliriz ekleyebilir.

4

AspectJ'un böyle şeyler yapabileceğini hatırlıyorum; Bununla ilgili hiç tecrübem yok, bu yüzden olasılıkları keşfetmek size kalmış! : D

+0

Kullanmadım ama duyduklarımdan dolayı AspectJ'e faydalı bir görünüm olabileceğini kabul ediyorum. – SJuan76

+1

Ayrıca tam kontrol kullanmak istiyorsanız cglib veya javassist kullanın. Ama Bahar ve "etrafında-tavsiye" kullanarak düşünün – Xeon

1

Kolay olduğunu düşünmüyorum.

Düşünebildiğim tek seçenek, bir sınıf yükleyicisi uygulamak ve orijinal sınıfları sizin tarafınızdan oluşturulan taslaklarla değiştirmek olurdu (Hazırda/JPA, tembel yükleme için böyle bir şey yapar). Taslaklar ihtiyacınız olan işlemi gerçekleştirir ve ardından işi yapmak için orijinal sınıfları çağırır. Bu ağır bir yük anlamına gelir (yansıma çağrıları ucuz değildir).

0

sizin ihtiyaç basitçe ise:

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("TestInstr"); 
CtMethod m = cc.getDeclaredMethod("sayHello"); 
m.insertBefore("{ System.out.println(\"method sayHello has been called\"); }"); 
cc.writeFile(); 

Kontrol ayrıntılı bilgi için bu linki:

bana tek yöntem için size bir örnek vereyim, sen Javassist veya yansıma kullanarak tüm yöntemlere bu uzatabilirsiniz Bir yöntemin kaydedilmesi için çağrıldı veya değil, daha sonra yönelimli programlama ihtiyacınız olan şeydir, AspectJ (statik) veya Spring AOP (dinamik) olursa olsun, her ikisi de bunun için güçlü bir yetenek sağlar. Bununla birlikte, yürütme süresinin izlenmesi, arama izlemesi gibi daha fazla enstrümanı yapmak istediğinizde bazı enstrüman kütüphanelerine ihtiyacınız olabilir. Umut eder.

İlgili konular