import?java.lang.reflect.InvocationTargetException;
import?java.lang.reflect.Method;
import?java.lang.reflect.Modifier;
public?class?AOPCallStaticMehtod?{
private?CallBack?callBack;
public?AOPCallStaticMehtod(CallBack?callBack)?{
this.callBack?=?callBack;
}
public?static?interface?CallBack?{
void?before(Method?method);
void?after(Method?method,?Object?result);
}
@SuppressWarnings({?"unchecked",?"rawtypes"?})
public?Object?callMethod(Class?clazz,?String?methodName,?Class[]?parameterTypes,?Object[]?parameters)?{
Object?result?=?null;
try?{
Method?method?=?null;
if?(parameterTypes?==?null?||?parameterTypes.length?==?0)?{
method?=?clazz.getMethod(methodName);
if?(Modifier.isStatic(method.getModifiers()))?{
callBack.before(method);
result?=?method.invoke(null);
callBack.after(method,?result);
}else{
System.out.println("這不是壹個靜態方法");
}
}?else?{
method?=?clazz.getMethod(methodName,?parameterTypes);
if?(Modifier.isStatic(method.getModifiers()))?{
callBack.before(method);
result?=?method.invoke(null,?parameters);
callBack.after(method,?result);
}else{
System.out.println("這不是壹個靜態方法");
}
}
}?catch?(NoSuchMethodException?|?SecurityException?|?IllegalAccessException?|?IllegalArgumentException
|?InvocationTargetException?e)?{
if?(e?instanceof?NoSuchMethodException)?{
System.out.println("沒有這個方法");
}?else?{
System.out.println("call?is?error!");
}
}
return?result;
}
public?static?void?main(String[]?args)?{
CallBack?callBack?=?new?CallBack()?{
@Override
public?void?before(Method?method)?{
if(method.getName().equals("test1")?||?method.getName().equals("test2")){
System.out.println(method.getName()?+?"方法在調用之前被攔截,可以在這裏切面編程");
}
}
@Override
public?void?after(Method?method,?Object?result)?{
if(method.getName().equals("test1")?||?method.getName().equals("test2")){
System.out.println(method.getName()?+?"方法調用以後被攔截,可以在這裏切面編程");
System.out.println(method.getName()?+?"執行結果是:"?+?result);
System.out.println("-----------------------------------------");
}
}
};
AOPCallStaticMehtod?AOPCallStaticMehtod?=?new?AOPCallStaticMehtod(callBack);
AOPCallStaticMehtod.callMethod(Test.class,?"test1",?new?Class[]?{?String.class?},?new?Object[]?{?"ppppppppppp"?});
AOPCallStaticMehtod.callMethod(Test.class,?"test2",?null,?null);
}
}
class?Test?{
public?static?void?test1(String?aa)?{
System.out.println(aa);
}
public?static?String?test2()?{
System.out.println("fffffffffffffffff");
return?"test2?result";
}
}