1700449216
编写高质量代码:改善Java程序的151个建议 建议115:使用Throwable获得栈信息
1700449217
1700449218
AOP编程可以很轻松地控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别,不能实现代码级别的植入(Weave),比如一个方法被类A的m1方法调用时返回1,在类B的m2方法调用时返回0(同参数情况下),这就要求被调用者具有识别调用者的能力。在这种情况下,可以使用Throwable获得栈信息,然后鉴别调用者并分别输出,代码如下:
1700449219
1700449220
class Foo{
1700449221
1700449222
public static boolean m(){
1700449223
1700449224
//取得当前栈信息
1700449225
1700449226
StackTraceElement[]sts=new Throwable().getStackTrace();
1700449227
1700449228
//检查是否是m1方法调用
1700449229
1700449230
for(StackTraceElement st:sts){
1700449231
1700449232
if(st.getMethodName().equals(“m1”)){
1700449233
1700449234
return true;
1700449235
1700449236
}
1700449237
1700449238
}
1700449239
1700449240
return false;
1700449241
1700449242
}
1700449243
1700449244
}
1700449245
1700449246
//调用者
1700449247
1700449248
class Invoker{
1700449249
1700449250
//该方法打印出true
1700449251
1700449252
public static void m1(){
1700449253
1700449254
System.out.println(Foo.m());
1700449255
1700449256
}
1700449257
1700449258
//该方法打印出false
1700449259
1700449260
public static void m2(){
1700449261
1700449262
System.out.println(Foo.m());
1700449263
1700449264
}
[
上一页 ]
[ :1.700449215e+09 ]
[
下一页 ]