public class WrapperAdapter implements Wrapper {
public static void main(String[] args) {
System.out.println( getCurrentMethod() );
new WrapperAdapter().main1();
}
public void main1(){
System.out.println( getCurrentMethod() );
}
/**
* 获得当前环境jdk版本信息
* http://blog.csdn.net/javaalpha/article/details/6366890
* @return
*/
public static float getJdkVersion(){
String javaVersion = System.getProperty("java.version");
if ( null != javaVersion ) {
int first = javaVersion.indexOf(".") ;
if ( -1 != first ) {
int index = javaVersion.indexOf(".", first+1) ;
if ( -1!= index) {
String prefix = javaVersion.substring(0, index ) ;
try {
return Float.parseFloat(prefix) ;
} catch (NumberFormatException e) {
//default 1.4
}
}
}
}
return 1.4f;
}
/**
* 获得当前方法名称
* http://blog.csdn.net/supercyclone/article/details/18599577
* @return
*/
public static String getCurrentMethod(){
float ver = getJdkVersion() ;
if ( ver >= 1.5f) {
//具体使用数组的那个元素和JVM的实现有关,我在SUN JDK6下面测试的是第二个元素,具体说明可以查看Thread.getStackTrace方法的javadoc
StackTraceElement[] stackFrame = Thread.currentThread().getStackTrace();
if ( stackFrame.length > 0 ) {
String method = Thread.currentThread().getStackTrace()[1+1].getMethodName();
return method ;
}
}
Exception exc= new Exception() ;
StackTraceElement[] frames =exc.getStackTrace();
//frames[0].getMethodName();//其中i = 0就是当前的类的方法名字 ;i == 1就是调用者的方法
if ( frames.length > 1 ) {
return frames[1].getMethodName() ;
}
return "" ;
}
}
通过调用jdk的方法调用栈 getStackTrace()获取当前方法。
getStackTrace 获得的是当前方法调用栈 ,返回StackTraceElement[],每个StackTraceElement为该数组是方法调用栈的栈帧。
Tip:
结合当前方法名称和java的反射函数。可以简化方法调用。