为spring代理类设置属性值

现在有一个bean包含了私有属性,如下:

Java代码   

  1. @Component
  2. public class Bean {
  3. String name;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. }

它被AOP配置过代理,代理配置为:

Java代码   

  1. <aop:pointcut expression="execution(* com..*Bean.*(..))"
  2. id="txBean" />

现在对它进行测试:

Java代码   

  1. public class BeanTest extends SpringContextTestCase{
  2. @Autowired
  3. private Bean bean;
  4. @Test
  5. public void testBean(){
  6. bean.setName("dylan");
  7. System.out.println(bean.name);
  8. System.out.println(bean.getName());
  9. }
  10. }

这里的测试结果中,第一个输出为null,第二个输出为dylan,

由于项目中需要直接通过bean.name的方式来获取属性值,却一直都只能得到null,请问如何才能获取到我所期望的值"dylan"呢

默认是没有办法的。我帮你写了个AOP切面 帮你完成设置属性。

Java代码   

  1. import java.beans.PropertyDescriptor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import org.aspectj.lang.JoinPoint;
  5. import org.aspectj.lang.annotation.After;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.springframework.aop.support.AopUtils;
  8. import org.springframework.beans.BeanUtils;
  9. import org.springframework.core.annotation.Order;
  10. @Aspect
  11. @Order(Integer.MIN_VALUE)
  12. public class SetterAspect {
  13. @After(value="execution(* *.set*(*)) && args(value)", argNames="value")
  14. public void after(JoinPoint jp, Object value) {
  15. Object proxy = jp.getThis();
  16. Object target = jp.getTarget();
  17. if(AopUtils.isAopProxy(proxy)) {//只有代理对象才需要处理
  18. try {
  19. Class<?> proxyClass = proxy.getClass();
  20. Class<?> targetClass = target.getClass();
  21. String methodName = jp.getSignature().getName();
  22. Method m = BeanUtils.findDeclaredMethod(proxyClass, methodName, new Class[]{value.getClass()});
  23. PropertyDescriptor descriptor = BeanUtils.findPropertyForMethod(m);
  24. String propName = descriptor.getName();
  25. Field f = targetClass.getClass().getDeclaredField(propName);
  26. if(f != null) {
  27. f.setAccessible(true);
  28. f.set(proxy, value);
  29. }
  30. } catch (Exception e) {
  31. e.printStackTrace();//记录好异常进行处理
  32. }
  33. }
  34. }
  35. }
时间: 2024-12-28 09:59:49

为spring代理类设置属性值的相关文章

java 中利用反射机制获取和设置实体类的属性值

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

c# 如何通过反射 获取\设置属性值

c# 如何通过反射 获取\设置属性值 //定义类public class MyClass{public int Property1 { get; set; }}static void Main(){MyClass tmp_Class = new MyClass();tmp_Class.Property1 = 2;Type type = tmp_Class.GetType(); //获取类型System.Reflection.PropertyInfo propertyInfo = type.Get

反射原理读取对象属性并设置属性值

Dictionary<string, string> dicNodes = new Dictionary<string, string>(); foreach (XmlNode node in nodes.ChildNodes) { if (node.NodeType==XmlNodeType.Element) { dicNodes.Add(node.Attributes["name"].Value,node.Attributes["value&quo

[转] C#反射设置属性值和获取属性值

/// /// 获取类中的属性值 /// /// /// /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value))

C#反射设置属性值和获取属性值

/// /// 获取类中的属性值 /// /// /// /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value))

Spring boot 的 properties 属性值配置 application.properties 与 自定义properties

配置属性值application.properties 文件直接配置: com.ieen.super.name="MDD" 自定义properties文件配置:src/main/resources/conf/boot.properties com.ieen.boot.name="123" com.ieen.boot.value="456" 调用方法@Value 注解调用application.properties属性值: @Value("

C#反射获取属性值和设置属性值

/// /// 获取类中的属性值 /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value)) return null

c# 如何通过反射 获取\设置属性值、

//定义类 public class MyClass{public int Property1 { get; set; }}static void Main(){MyClass tmp_Class = new MyClass();tmp_Class.Property1 = 2;Type type = tmp_Class.GetType(); //获取类型System.Reflection.PropertyInfo propertyInfo = type.GetProperty("Property

Spring给bean初始化属性值

可以在Spring容器初始化bean的时候给bean的属性赋初始值,直接在property标签里设置即可 1 2 3 4 5 6 <bean name="user**" class="com.fz.entity.User" >     <property name="id" value="1"></property>     <property name="username&