java知识那么多,怎么学好呢?----记作用、找核心类、突破口、见名知意

简介: java知识那么多,怎么学好呢?----记作用、找核心类、突破口、见名知意

✿ 这里咱以学习内省机制和反射为例

1、学习新知识点----记住作用(先了解是什么、和前面的知识点有什么联系、作用)

(1)先了解什么是反射?【简单理解和比较官方的描述】

  • 简单理解:反射,就是得到类(这种对象的)类【java.lang.Class】,得到类的元数据的过程。
  • 比较官方的描述:在运行时期,动态地区获取某个类中的成员的信息(构造器、方法、字段、内部类、接口、父类等等)。

(1)先了解什么是内省?

  • 简单理解:用反射实现的,用来获取javabean的信息的机制。
  • 比较官方的描述:sun公司针对特殊的类---javaBean推出的技术。内省机制就是用来获取javabean的信息的。

(2)内省机制和反射的联系:

其实内省机制也是通过反射来实现的,而反射是对一切类都适合去动态获取类的信息,而内省机制是sun公司针对特殊的类---javaBean推出的技术。内省机制就是用来获取javabean的信息的。

(3)反射的作用是什么?

  • 得到类(这种对象的)类【java.lang.Class】,即得到类的信息(构造器、方法、字段、内部类、接口、父类等等)。

(3)内省的作用是什么?

  • 用来获取javabean的信息(属性、方法、事件)


2、学习新知识点----抓住核心类、突破口、见名知意

  • 先关注核心类所在的包,例如反射Class在lang包;内省Introspector在beans包

■ 例如反射的核心类----Class【作用结合见名知意,拥有类有关的一切信息(构造器、方法、字段、内部类、接口、父类等等)

■ 例如内省机制的核心类---Introspector【作用结合见名知意,拥有javaBean有关的一切信息(属性、方法、事件)


2-2、反射---操作构造器(方法、字段是同理可得的)

Class(核心类、学习反射机制的突破口、学习操作构造器的学习入口)---操作g构造器

  • 第一步就是先得到该构造器所在类的字节码对象(要获取一个类的构造器,需要将该类先加载进虚拟机):
  • Class类中的静态方法forName("类的全限定名称")获取Class对象【字节码对象】
  • 在Class类中找到获取构造器的方法【在突破口中:得到构造器对象

  • 第二个突破口是拥有构造器有关的一切的Constructor:【在突破口中:得到创建对象实例的方法
  • 构造器最大作用:创建对象

✿ 反射机制操作构造器的代码如下:

//类中的构造器可以被外界访问同时没有参数,直接使用Class类的newInstance方法创建对象
Class<Person> clazz = Person.class;
Constructor<Person> con= clazz.getConstructor();
con.newInstance();
System.out.println("========================");
//反射:调用构造器的方法创建对象[无参构造器]
clazz = Person.class;
con= clazz.getConstructor(String.class);
con.newInstance("shan");
System.out.println("========================");
//反射:调用构造器的方法创建对象[无参构造器]
clazz = Person.class;
con= clazz.getDeclaredConstructor(String.class, int.class);
//设置当前的构造器【私有的】可以访问
con.setAccessible(true);
con.newInstance("shan", 10);




2-2、内省---操作javaBean

Introspector(核心类、学习内省机制的突破口、学习操作javaBean的学习入口)---操作javaBean

  • 第一步就是先得到该javaBean:【在突破口中:得到javaBean的描述对象BeanInfo对象
  • 方法getBeanInfo的参数是该javaBean的字节码,结果是得到javaBean的信息---BeanInfo对象(javaBean的描述对象)

81.png

  • 第二个突破口拥有javaBean的一切的BeanInfo:【在突破口中:得到javaBean的属性描述器PropertyDescriptor
  • 方法getPropertyDescriptors(),结果是得到javaBean的属性信息---PropertyDescriptor属性数组对象(javaBean的属性描述器对象)


82.png


第三个突破口拥有javaBean的属性的一切的PropertyDescriptor:【在突破口中:得到关于属性的操作
  • 属性描述器是数组----遍历

83.png


✿ 内省机制操作javaBean的属性代码如下:

@Test
  public void testIntrospector() throws Exception {
    //1、通过突破口(核心类Introspector)获取javaBean描述对象BeanInfo
    BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
    //2、获取javaBean中的属性描述器
    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
    //创建一个Person对象
    Person person = new Person();
    for (PropertyDescriptor pd : pds) {//遍历数组描述器数组
      //3-1、获取当前的属性的属性名
      System.out.println("当前属性的属性名是:" +pd.getName());
      System.out.println("当前属性的getter方法是:" +pd.getReadMethod());
      System.out.println("当前属性的setter方法是:" +pd.getWriteMethod());
      if("name".equals(pd.getName())) {//若当前属性名是name【不能直接使用setName方法,因为反射的时候并不知道是哪个具体的方法】
        Method setter = pd.getWriteMethod();//3-2、获取setter方法
        setter.invoke(person, "shan");//设置当前person对象的name值为shan
      } 
    }
  }
目录
相关文章
|
3天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
3天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
11 0
|
9天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
9天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
25 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
|
10天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
11天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
12天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
20 4
|
12天前
|
Java
在Java中,多态性允许不同类的对象对同一消息做出响应
【4月更文挑战第7天】在Java中,多态性允许不同类的对象对同一消息做出响应
17 2