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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用java语言,如何对一个类中的静态方法做切面编程?相关的知识,希望对你有一定的参考价值。

aop的事务代理机制最重要的放心是确定切入点,面,通知.具体看代码,下面是在spring中配置的我自己写的一个异常处理的aop作用类 ,该配置切入面在于在controller包下的所有类的所有注解为aspect的切面类,通知类型为表示在目标方法之前切入,切入点为controller包下的所有类所有方法.至于楼主所说的静态方法对于事务机制应该没什么区别吧,只要用within方法一样可以的

<!-- 定义共同处理组件 -->
<bean id="loggerBean"
class="org.tedu.cloudnote.aspect.LoggerBean">
</bean>
<!-- 将loggerBean组件切入到Controller方法上 -->
<aop:config>
<!-- 要切入哪个共同处理组件,ref指定共同组件id值 -->
<aop:aspect ref="loggerBean">
<!-- aop:before表示在目标方法之前切入,
method指定方法名;pointcut指定目标组件 -->
<aop:before method="logController"
pointcut="within(org.tedu.cloudnote.controller..*)"/>
</aop:aspect>
</aop:config>
之后这个bean所定义的 自定义类的代码如下 ,希望楼主给个采纳,如果问友喜欢,也可以给我个赞哦,摸摸大

package org.tedu.cloudnote.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//封装共同处理的组件
@Component//扫描,等价于<bean>定义
@Aspect//等价于<aop:aspect ref="">
public class LoggerBean

//要在Controller.execute开始位置切入
//方法规则:public void 方法名()... (前置通知)
@Before("within(org.tedu.cloudnote.controller..*)")
//等价于<aop:before method="logController" pointcut="">
public void logController()
System.out.println("进入Controller组件处理");


参考技术A 静态方法你使用静态切点就可以了娃
org.springframework.aop.support.StaticMethodMatcherPointcut

静态方法来匹配切面
org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor
参考技术B 静态方法是不oo的。因此做切面本身也是目的不明的。
如果你实在要切, 其实就是替换字节码内容, 可以试试cglib
参考技术C 不能这样,这样会引起程序错乱的 参考技术D 光java没用。要用spring定义切入点和切面

Java中的静态和枚举

一、静态成员

对静态成员最简单的解释,静态成员属于整个类而不属于某个对象,所以又叫做类变量。一个类不管创建多少个实例对象,静态变量在内存中有且只有一个(调用方法用类名调用)。

通常的非静态变量称为实例变量,只有实例化后才可使用。

二、静态方法

类似于静态变量,在类装载时被载入内存,不会自动销毁,不用实例化,且静态方法不能被重写。

静态方法只能访问类中的静态变量和静态方法不能访问实例变量和实例方法(因为静态方法在java虚拟机中在对象之前被加载,如果静态方法要访问实例变量或者方法可能其还没被创建),如果要想使用实例变量和方法可在静态方法中直接创建其实例化的对象。

三、枚举

enum  表示可以计数的一种类型

列举一个遍历枚举类的方法:

package None5;

public enum Day {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday;
}


package None5;

public class Ergodic {
    public static void main(String[] args) {
        for(Day d:Day.values()) {
            System.err.println(d.toString());
        }
    }
}

 

 

四、一个综合静态和枚举的例子

package None4;

public enum personGender {
    Male,
    Female;
}
package None4;

public class Person {
    private String name;
    private int age;
    private personGender gender;
    //静态国籍变量
    private static String nation;
    
    
    //set方法
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setGender(personGender gender) {
        this.gender = gender;
    }
    public static void setNation(String nation) {
        Person.nation=nation;
    }
    
    //get方法
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public personGender getGender() {
        return gender;
    }
    
    //show方法
    public static void show() {
        Person person = new Person();
        person.setName("lemon");
        person.setAge(20);
        person.setGender(personGender.Male);
        System.err.println(String.format("姓名=%s,性别=%s,年龄=%d,国籍=%s", person.name,person.gender,person.age,nation));
    }
}
package None4;

public class client {
    public static void main(String[] args) {
        
        //静态成员属于整个类而不是某个对象,所以这里应该用Person调用
        Person.setNation("CHINA");
        Person.show();
    }
}

运行结果:

姓名=lemon,性别=Male,年龄=20,国籍=CHINA

 

第一篇博客,加油!

努力努力再努力!


以上是关于使用java语言,如何对一个类中的静态方法做切面编程?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA如何获取嵌套在静态LIST类中的静态LIST类

java 多线程3:Thread类中的静态方法

如何调用内部类中的静态方法

Java多线程3:Thread中的静态方法

C++ 静态方法(在不同的类中)(如 Java 的)

如何对Java单例模式进行mock