1 0

通过spring aop代理的方法和final方法获取的不是同一个类变量5

目标类的set方法是final的,get方法不是。aop代理之后set的值在get为空。求解这是为什么???前提是final的是客户的框架,我动不了。有什么解决方法吗??
目标方法
package demo.aop;
import org.springframework.stereotype.Component;
@Component("test")
public class TestService  {
    String data;
    public String getData() {
        return data;
    }
    public final void setData(String data) {
        this.data = data;
    }
}
Mian
package demo.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("demo/aop/applicationContext.xml");
        TestService service=(TestService) context.getBean("test");
//        service.test();
        service.setData("AAA");
        String sss=service.getData();
        System.out.println(sss);
//        service.out();
        
        System.out.println("end");
//        service=new TestService();
//        service.setData("BBB");
//        service.setData0("AAA");
//        service.out();
    }
}
Aop
package demo.aop;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* demo.aop.*.*test(..))")
    public void testPointCut() {
    }

    @Around("testPointCut()")
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
        Object object = point.proceed();
        return object;
    }
}
2012年12月12日 00:16

1个答案 按时间排序 按投票排序

0 0

采纳的答案

切入点写错了
"execution(* demo.aop.*.*test(..))"

应该是如
"execution(* demo.aop.*.*(..))"

不是这的问题

如图


使用cglib会生成目标对象的子类,然后调用set时会直接设置代理对象的data,所以造成了target的data没有设置。 当你调用get方法时因为是final 所以没有被代理 直接调用的是目标对象的,所以是null。
1、解决办法,可以参考之前类似的问题,通过aop解决
http://jinnianshilongnian.iteye.com/blog/1678800

2、如果改不了目标,可以考虑适配器设计模式

2012年12月12日 07:29

相关推荐

    Java 基础核心总结 +经典算法大全.rar

    获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    涵盖了90%以上的面试题

    一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,protected,以及不写时的区别 为什么java中有些...

    java面试宝典

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    千方百计笔试题大全

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    Java面试宝典2010版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上...

    最新Java面试宝典pdf版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试笔试资料大全

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java语言基础下载

    常用对象的属性和方法 525 算术函数的math对象 527 创建新对象 529 JavaScript中的数组 532 实例 535 文档对象功能及其作用 538 document中三个主要的对象 539 文档对象的基本元素 541 窗口及输入输出 544 输出流及...

    Java面试宝典2012版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用...

    Java面试宝典-经典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    JAVA面试宝典2010

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java面试宝典2012新版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    java面试题大全(2012版)

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    java面试宝典2012

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 8 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

Global site tag (gtag.js) - Google Analytics