Vitor Pamplona

Innovation on Vision: Imaging , Enhancement and Simulation

__FILE__, __LINE__ e __FUNCTION__ em Java

__FILE__, __LINE__ e __FUNCTION__ são macros do C + + padrão. Em tempo de compilação, elas são substituídas pelo nome do arquivo, linha e nome da função corrente respectivamente. São muito úteis para gerar logs, como no exemplo abaixo:

#include <stdlib.h>
#include <stdio.h>

int_stack make_int_stack(void) {
int_stack stack = xalloc(struct int_stack);
if (!stack) {
fprintf(stderr, "%s %d: out of memory\n", __FILE__, __LINE__);
abort();
}
}

Se você vem do mundo C provavelmente vai estranhar a falta destas macros ou qualquer coisa semelhante na linguagem java. Fato que é justificado pela presença destas informações no lançamento da grande maioria das exceções do java. Uma stack trace comum no java é impressa da seguinte forma:

java.lang.Throwable
at java.awt.Component.invalidate(Component.java:1664)
at java.awt.Container.invalidate(Container.java:507)
at java.awt.Window.dispatchEventImpl(Window.java:696)
at java.awt.Component.dispatchEvent(Component.java:2289)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:258)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:68)

Apesar da justificativa plausível, existem requisitos que necessitam destas informações sem que exista uma exceção. Apesar de não recomendado, a única maneira de extrair o nome do arquivo atual, a linha atual e a função atual ou a função que chamou a função corrente, é através da Stack Trace. Não é necessário lançar uma exceção manual, apenas cria-se uma instância de java.lang.Throwable e busca-se o elemento correto da Stack:  

public class Test {  
public static void main(String args[]) {
System.out.println(getLineInfo());
}

public static String getLineInfo() {
// Busca o segundo elemento da Stack, pois o primeiro seria referente a linha abaixo.
// O segundo elemento é referente a linha 3.
StackTraceElement ste = new Throwable().getStackTrace()[1];
// Imprime o nome do arquivo e a linha.
return "Arquivo: " + ste.getFileName() + ": Line " + ste.getLineNumber();
}
}  

O método getFileName () retorna o nome do arquivo, o getClassName ()   o nome da classe (lembre-se que você pode ter mais de uma classe java no mesmo arquivo) o getMethodName () retorna o nome do método, e o getLineNumber () a linha. A execução deste código retorna:  

vitor@vitor-laptop:~/Desktop$ java Test
Arquivo: Test.java: Line 3

Quem preenche as informações da Stack é a própria JVM através do método nativo

public synchronized native Throwable fillInStackTrace(); 

encontrado dentro da classe Throwable. O fillInStackTrace é implementado pelo Throwable.c que repassa para a JVM.cpp. Depois disso eu já não sei mais para one vai. De qualquer forma, não é uma informação acessível.  

Posted in Mar 7, 2011 by Vitor Pamplona - Edit - History

Showing Comments

uggs are great with jeans. Try these looks, either alternative provides you the fashionable look of wearing ugg boots. and the confidence that comes with skinny jeans more than the ugg.


- - nicole

- - Posted in Nov 29, 2011 by 60.176.111.167

Add New Comment

Your Name:


Write the code showed above on the text below.