使用java语言,如何对一个类中的静态方法做切面编程?

如题所述

package com.classloader.test;

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";
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-06-06
方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。
目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
第2个回答  2016-07-14
切面编程就是面向接口编程,好处是类似于usb这样的插拔操作,不需要这个功能是删除这个接口就行了,你可以写个接口,然后使用代理类,来实现丰富静态方法的编程
第3个回答  2017-05-17
用的什么?Guice?Sprint?AspectJ?
一般静态方法不支持aop,aspectj好像可以,为什么要拦截静态方法?设计没问题吗?可以返回单例,然后调用非静态方法就可以拦截了,或者在非静态方法中调用静态方法,拦截非静态方法。
第4个回答  2017-05-07
这个真不行(也许ApsectJ可以,但不是动态的):
切面编程基本原理是动态继承你的类,或者动态生成一个你接口的实现,在调用前后搞事情。
静态的没法继承的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网