• Java内省机制


    一. 内省

    1:维基百科解释

    在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。

    2:Java语言中解释

    内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”,方法比较少,这些信息储存在类的私有变量中,通过set()、get()获得

    二:内省和反射的区别

    1: 反射是在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。

    2: 内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。 JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。

    3:比较

    三:JDK内省类库

    • java.beans.Introspector:Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。

    • java.beans.BeanInfo接口:希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。

    • java.beans.PropertyDescriptor:PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性

    四:内省代码测试


    /**
    * Java内省机制测试
    *
    * @see java.beans.BeanInfo
    * @see java.beans.Introspector
    * @see java.beans.PropertyDescriptor
    * @see java.beans.MethodDescriptor
    **/
    public class IntrospectorTest {

       private User user;

       @Before
       public void init() {
           user = new User();
           user.setAge(20);
           user.setId(UUID.randomUUID().toString());
           user.setName("刘恩源");
      }


       @Test
       public void testIntrospector() throws Exception {

           //get BeanInfo
           BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
           
           
           //PropertyDescriptor
           PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
           for (PropertyDescriptor pd : pds) {
               Method method = pd.getReadMethod();
               String methodName = method.getName();
               Object result = method.invoke(user);
               System.out.println(methodName + "-->" + result);
          }


           //get name property descriptor
           PropertyDescriptor namePropertyDescriptor = new PropertyDescriptor("name", User.class);
           //得到name属性的getter方法
           Method readMethod = namePropertyDescriptor.getReadMethod();
           //执行getter方法,获取返回值,即name属性的值
           String result = (String) readMethod.invoke(user);
           System.out.println("user.name" + "-->" + result);
           //得到name属性的setter方法
           Method writeMethod = namePropertyDescriptor.getWriteMethod();
           //执行setter方法,修改name属性的值
           writeMethod.invoke(user, "刘恩源1");
           System.out.println("user.name" + "-->" + user.getName());


      }
    }
  • 相关阅读:
    扩展域并查集经典题
    2010提高组-C]关押罪犯(扩展域并查集
    [2015普及组-D]推销员 思维que
    The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
    Fire-Fighting Hero(多源最短路和单源最短路)
    The Preliminary Contest for ICPC Asia Xuzhou 2019
    Cow Routing(最短路spfa)
    hdu6582
    ACM_题目这么难,来局愉快的昆特牌吧
    ACM_水题你信吗
  • 原文地址:https://www.cnblogs.com/liuenyuan1996/p/10243552.html
Copyright © 2020-2023  润新知