java propertydescriptor_Spring Integration

java propertydescriptor_Spring Integration总结满足以下条件才会生成PropertyDescriptor(注意读写方法是否为空,spring中by_type类型注入会筛选出具有写方法不为空的PropertyDescriptor):1、参数个数必须2个以内、方法不是static2、方法没有参数:方法有readMethod没有writeMehtod1、普通get开头方法2、返回值boolean以is开头的3、有一个参数1、有一个参数且int类型,方法get开头的,没有readMethodwriteMehtod等属性2、没有返回值、

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、jdk中类PropertyDescriptor获取

  jdk中Introspector类为工具提供了一种标准的方法来了解目标Java Bean支持的属性、事件和方法。
  java.beans.Introspector#getTargetPropertyInfo

	private PropertyDescriptor[] getTargetPropertyInfo() {


        // Apply some reflection to the current class.

        // First get an array of all the public methods at this level
        Method methodList[] = getPublicDeclaredMethods(beanClass);

        // Now analyze each method.
        //遍历所有方法看是否是符合PropertyDescriptor
        for (int i = 0; i < methodList.length; i++) {
            Method method = methodList[i];
            if (method == null) {
                continue;
            }
            // skip static methods.
            int mods = method.getModifiers();
            if (Modifier.isStatic(mods)) {
                continue;
            }
            String name = method.getName();
            Class<?>[] argTypes = method.getParameterTypes();
            Class<?> resultType = method.getReturnType();
            int argCount = argTypes.length;
            PropertyDescriptor pd = null;

            if (name.length() <= 3 && !name.startsWith(IS_PREFIX)) {
                // Optimization. Don't bother with invalid propertyNames.
                continue;
            }

            try {

                if (argCount == 0) {
                    /**
                     * 方法没有参数:方法有readMethod没有writeMehtod
                     *    1、普通get开头方法
                     *    2、返回值boolean 以is开头的
                     */
                    if (name.startsWith(GET_PREFIX)) {
                        // Simple getter
                        pd = new PropertyDescriptor(this.beanClass, name.substring(3), method, null);
                    } else if (resultType == boolean.class && name.startsWith(IS_PREFIX)) {
                        // Boolean getter
                        pd = new PropertyDescriptor(this.beanClass, name.substring(2), method, null);
                    }
                } else if (argCount == 1) {
                    /**
                     * 有一个参数
                     * 1、有一个参数且int类型,方法get开头的,没有readMethod  writeMehtod等属性
                     * 2、没有返回值、set方法开头的,具有writeMethod
                     */
                    if (int.class.equals(argTypes[0]) && name.startsWith(GET_PREFIX)) {
                        pd = new IndexedPropertyDescriptor(this.beanClass, name.substring(3), null, null, method, null);
                    } else if (void.class.equals(resultType) && name.startsWith(SET_PREFIX)) {
                        // Simple setter
                        pd = new PropertyDescriptor(this.beanClass, name.substring(3), null, method);
                        if (throwsException(method, PropertyVetoException.class)) {
                            pd.setConstrained(true);
                        }
                    }
                } else if (argCount == 2) {
                    /**
                     * 两个参数
                     * 1、返回值void ,第一个参数int类型,set开头的会生成PropertyDescriptor(注意此时没有writeMethod)
                     */
                    if (void.class.equals(resultType) && int.class.equals(argTypes[0]) && name.startsWith(SET_PREFIX)) {
                        pd = new IndexedPropertyDescriptor(this.beanClass, name.substring(3), null, null, null, method);
                        if (throwsException(method, PropertyVetoException.class)) {
                            pd.setConstrained(true);
                        }
                    }
                }
            } catch (IntrospectionException ex) {
                pd = null;
            }

            if (pd != null) {
                if (propertyChangeSource) {
                    pd.setBound(true);
                }
                addPropertyDescriptor(pd);
            }
        }

    processPropertyDescriptors();


}

总结满足以下条件才会生成PropertyDescriptor(注意读写方法是否为空,spring中by_type类型注入会筛选出具有写方法不为空的PropertyDescriptor):
1、参数个数必须2个以内、方法不是static
2、 方法没有参数:方法有readMethod没有writeMehtod
1、普通get开头方法
2、返回值boolean 以is开头的
3、 有一个参数
1、有一个参数且int类型,方法get开头的,没有readMethod writeMehtod等属性
2、没有返回值、set方法开头的,具有writeMethod
4、两个参数
1、返回值void ,第一个参数int类型,set开头的会生成PropertyDescriptor(注意此时没有writeMethod)

综上所述:具有写方法的必须返回值void 且set开头一个参数的的才有写方法(spring中by_type类型注入会筛选出具有写方法不为空的)

demo 具有写方法的PropertyDescriptor演示:

//@Component
public class UserService { 
   



    private  OrderService  orderService;
   //返回值不为void
    public  OrderService  setOrderService(OrderService orderService){ 
   
        //this.orderService=orderService;
        return orderService;
    }
    //返回值不为void
    public  OrderService  setOrderService(int  test,OrderService orderService){ 
   
        this.orderService=orderService;
        return orderService;
    }
    //返回值void 一个参数满足要求
    public  void  setService12123(OrderService orderService1){ 
   
       System.out.println("1231"+orderService);
    }
    //返回值void 参数个数大于2不满足
    public  void  setOrderService(int  test,OrderService orderService,StockService stockService){ 
   
        this.orderService=orderService;
    }
}


public class Test { 
   

    public static void main(String[] args) throws IntrospectionException { 
   
       BeanInfo beanInfo= Introspector.getBeanInfo(UserService.class);
       PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
       for(PropertyDescriptor propertyDescriptor:propertyDescriptors){ 
   
           System.out.println(propertyDescriptor.getWriteMethod());
       }
    }
}
此时满足条件方法有getClass(继承父类的Object) 、setService12123会生成PropertyDescriptor且具有写方法

在这里插入图片描述

存在问题:
方法有返回值、且静态的方法是不具备生成PropertyDescriptor属性描述器,spring中org.springframework.beans.ExtendedBeanInfo#isCandidateWriteMethod拓展有返回值、或者static也会生成
PropertyDescriptor**
满足以下条件:
return methodName.length() > 3 && methodName.startsWith(“set”) && Modifier.isPublic(method.getModifiers()) && (!Void.TYPE.isAssignableFrom(method.getReturnType()) || Modifier.isStatic(method.getModifiers())) && (nParams == 1 || nParams == 2 && Integer.TYPE == method.getParameterTypes()[0]);

二、spring针对jdk进行拓展,ExtendedBeanInfo对jdk不满足的方法进行扩展(有返回值、static)生成PropertyDescriptor

 **满足以下条件才会生成PropertyDescriptor
   1、set开头方法
   2、public方法
   3、返回值不是void或者是静态
   4、参数一个或者2个(2个实话第一个参数必须为int类型)**
     //1、set开头方法
       2public方法
       3、返回值不是void或者是静态
       4、参数一个或者2个(2个实话第一个参数必须为int类型)
   
    public static boolean isCandidateWriteMethod(Method method) { 
   
        String methodName = method.getName();
        int nParams = method.getParameterCount();
        return methodName.length() > 3 && methodName.startsWith("set") && Modifier.isPublic(method.getModifiers()) && (!Void.TYPE.isAssignableFrom(method.getReturnType()) || Modifier.isStatic(method.getModifiers())) && (nParams == 1 || nParams == 2 && Integer.TYPE == method.getParameterTypes()[0]);
    }

三、总结

spring依赖注入(@Bean(autowire=Autowire.BY_TYPE)实话会找到该类所有PropertyDescriptor满足条件的方法
1、从jdk中Introspector中获取
2、扩展ExtendedBeanInfo获取

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188727.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月15日 下午7:34
下一篇 2026年4月15日 下午7:40


相关推荐

  • Java8中set转list

    Java8中set转list实现相同的逻辑功能,但是耗时缩短了很多,逻辑的实现是最基础的要求,如何提升效率提高代码质量才是一个有活力的程序员转载于:https://my.oschina.net/u/358904…

    2022年10月7日
    5
  • JavaScript小白教程6JS高级教程

    JavaScript小白教程6JS高级教程JavaScript对象所有事物都是对象JavaScript提供多个内建对象,比如String、Date、Array等等。对象只是带有属性和方法的特殊数据类型。布尔型可以是一个对象。

    2022年8月4日
    7
  • restful接口定义_主板上的spi接口接什么

    restful接口定义_主板上的spi接口接什么由于在实际项目中碰到的restful服务,参数都以json为准。这里我获取的接口和传入的参数都是json字符串类型。发布restful服务可参照文章http://www.cnblogs.com/jav

    2022年8月6日
    8
  • Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

    Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

    2026年3月16日
    2
  • 向量点乘与叉乘

    向量点乘与叉乘向量点乘与叉乘向量 Vector nbsp nbsp nbsp nbsp nbsp 在几乎所有的几何问题中 向量 有时也称矢量 是一个基本点 向量的定义包含方向和一个数 长度 在二维空间中 一个向量可以用一对 x 和 y 来表示 例如由点 1 3 到 5 1 的向量可以用 4 2 来表示 这里大家要特别注意 我这样说并不代表向量定义了起点和终点 向量仅仅定义方向和长度 向量加法 nbsp nbsp nbsp nbsp nbsp 向量也支持各种数学运算 最简单的就是加法

    2026年3月20日
    3
  • 微信开放平台实现扫码登录(java)

    微信开放平台实现扫码登录(java)微信第三方登录准备阶段微信官方文档准备工作在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程授权流程说明整体流程分:1.第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;2.通过code参数加上AppID和AppSecret等,通过API换取access_token;3.通过access_token进行接口调

    2022年4月29日
    232

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号