2012-03-02 38 views
9

Tôi đang sử dụng Groovy 1.8.4, cố gắng để có được tên của hàm kèm theo ...Groovy, lấy tên của hàm kèm theo?

def myFunction() { 
    println functionName?? 
} 

Tôi đã thử delegate, this, owner, Groovy phàn nàn không có đối tượng như vậy được tìm thấy.

Tôi cũng đã cố gắng Java Hack new Exception().getStackTrace()[0].getMethodName(), nhưng điều đó chỉ in newInstance0

+0

Tôi có thể hỏi những gì bạn đang cố gắng để hoàn thành với tên phương pháp? –

+0

Truy tìm đầu ra ... chúng ta đang xây dựng một POC, mã đang thay đổi thường xuyên, chúng ta có một phương thức in một tiêu đề khi nó bắt đầu một hàm mới, chúng ta muốn tên đến từ chính hàm thay vì truyền nó như một đối số trong trường hợp tên hàm thay đổi – raffian

+0

Có một ví dụ trong http://stackoverflow.com/a/9417763/190201 cũng như cách lấy số dòng và tên tệp hiện tại. – ataylor

Trả lời

3

Bạn có thể tới nó thông qua stacktrace, tôi đã có thể để có được nó thông qua:

groovy:000> def foo() { println Thread.currentThread().stackTrace[10].methodName } 
===> true 
groovy:000> foo() 
foo 
groovy:000> class Foo {                
groovy:001> def bar() { println Thread.currentThread().stackTrace[10].methodName } 
groovy:002> } 
===> true 
groovy:000> new Foo().bar() 
bar 
+4

vâng nhưng bạn loại phải đoán chiều sâu stacktrace :) và nó không được bảo đảm để ở lại liên tục với bản phát hành groovy tương lai –

+1

Để xây dựng mã @doelerri s. Bạn có thể làm một cái gì đó như thế này: 'Thread.currentThread(). StackTrace.find {it.className.startsWith (" com.project ... ")}. MethodName'. Ở đó bạn có thể làm bất cứ điều gì bạn cảm thấy thoải mái với để đảm bảo rằng nếu chiều sâu stacktrace không ở lại phù hợp thì bạn sẽ nhận được mã của bạn. –

+0

@JarredOlson Không phải chỉ là hack? Groovy đáng ngạc nhiên không cung cấp tính năng như vậy – raffian

11

Làm thế nào về của groovy StackTraceUtils.sanitize? Dưới đây là một ví dụ nhanh:

import org.codehaus.groovy.runtime.StackTraceUtils 

class A { 
    def methodX() { 
    methodY() 
    } 

    def methodY() { 
    methodZ() 
    } 

    def methodZ() { 
    def marker = new Throwable() 
    StackTraceUtils.sanitize(marker).stackTrace.eachWithIndex { e, i -> 
     println "> $i ${e.toString().padRight(30)} ${e.methodName}" 
    } 
    } 

} 

new A().methodX() 

Đầu ra của trên khi dán vào một kịch bản độc lập test.groovy được như sau:

phương pháp
$ groovy test.groovy 
> 0 A.methodZ(test.groovy:13)  methodZ 
> 1 A.methodY(test.groovy:9)  methodY 
> 2 A.methodX(test.groovy:5)  methodX 
> 3 A$methodX.call(Unknown Source) call 
> 4 test.run(test.groovy:21)  run 

các Sanitize lọc ra tất cả groovy mumbo jumbo nội bộ từ các dấu vết và dấu vết sạch sẽ cùng với ...stackTrace.find { } sẽ cung cấp cho bạn một khởi đầu tốt.

11
import org.codehaus.groovy.runtime.StackTraceUtils 

def getCurrentMethodName(){ 
    def marker = new Throwable() 
    return StackTraceUtils.sanitize(marker).stackTrace[1].methodName 
} 

def helloFun(){ 
    println(getCurrentMethodName()) 
} 

helloFun() 

đầu ra:

helloFun 
+1

khi getCurrentMethodName() được gọi trong một bao đóng, nó sẽ hiển thị doCall(). tức là myArray.each {e -> println getCurrentMethodName(); } –

Các vấn đề liên quan