1. IDEA的Structure中查看属性和字段

image.png
如上图所示:

  • 属性c 由 getter/setter和字段 c 组成
  • 属性a 由getter/setter组成
  • b 没有getter和setter,所以是字段
  • D和AAb用来验证属性名称

属性名称规则:去掉get或set后其剩余的字符串,如果第二个字母是小写的,则把第一个字母也变成小写,否则第一个字母也不变

Java中的属性(property),通常可以理解为get和set方法,而字段(field),通常叫做“类成员”,或 “类成员变量”,有时也叫“域”,理解为“数据成员”,用来承载数据的。

区别开属性与字段是为了更好的实现数据安全,比如当我们想给一个类的属性赋值或者其他类用到了,就需要将这个字段设置为public,然而这样可以对字段进行任意的读写操作,非常不利于数据安全。于是就加上了属性,简单说属性实现了字段的封装,属性有get、set 方法来控制字段,该字段的属性只有set方法没有get方法,就只可以对该方法进行赋值操作,没有读操作,反之亦然。就是对对字段的操作通过属性来控制。

突然想起2015年遇到的一个问题,当时给类起了个名字类似ABc(也就是首字母和第二个字母都是大写),然后用spring用类名注入时,我就把类名写成 aBc,当时就是无法注入,后来把类名改成Abc勉强解决这个问题,现在想想应该把注入的类名写成ABc就可以了。

2. Java 反省查看属性

通过Java 反省API证明属性

  1. import java.beans.BeanInfo;
  2. import java.beans.IntrospectionException;
  3. import java.beans.Introspector;
  4. import java.beans.PropertyDescriptor;
  5. import java.lang.reflect.Method;
  6. public class Main {
  7. public static void main(String[] args) throws IntrospectionException {
  8. BeanInfo beanInfo = Introspector.getBeanInfo(Demo.class);
  9. PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  10. for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
  11. System.out.println(propertyDescriptor.getName());
  12. System.out.println(propertyDescriptor.getReadMethod().getName());
  13. Method writeMethod = propertyDescriptor.getWriteMethod();
  14. System.out.println(writeMethod != null ? writeMethod.getName():"");
  15. System.out.println("-----------------");
  16. }
  17. }
  18. }

AAb getAAb

setAAb

a getA

setA

c getC

setC

class getClass


d getD

setD

说明:class是Object中的方法,只有get,没有set.

  1. public final native Class<?> getClass();

3. 验证Spring bean name也遵循这个规则

  1. package cn.java.money.spring.bean;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class AAb {
  5. }
  1. package cn.java.money.spring.bean;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Bbc {
  5. }
  1. package cn.java.money.spring;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. @ComponentScan
  6. public class Config {
  7. }
  1. package cn.java.money.spring;
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  3. public class Main {
  4. public static void main(String[] args) {
  5. AnnotationConfigApplicationContext ac =
  6. new AnnotationConfigApplicationContext(Config.class);
  7. String[] beanDefinitionNames = ac.getBeanDefinitionNames();
  8. for (String name : beanDefinitionNames) {
  9. System.out.println(name);
  10. }
  11. }
  12. }

AAb
bbc