• JavaEE企业开发新技术1


    目录

    2.1  Class对象基本概念

    1、概念

    2.2 Class对象的获取方式

    2.3基本数据类型的Class对象

    1、概念

    2.4 反射的基本概念

    概念

    2.5 Class对象的基本使用-1

    2.6 Class对象的基本使用-2

    newInstance()和new()区别:


    2.1  Class对象基本概念

    1、概念

    反射的基础——Class

    Java当中的类用来表示具有相同属性和方法的对象的结合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性价值

    Java当中定义的所有类都属于同一类事物,可以用Class来表示

    Class类的对象就是不同的类对应的字节码

    获取Class对象:

    A a=new A()

    获取Class对象的三种方式

    1. 创建对象,通过对象名调用getClass拿到Class对象

    Person p1=new Person();

    P1.getClass();

    1. 直接通过类名.Class拿到Class对象

    Person.class

    1. Class.forName()方法

    Class.forName(“java.lang.String”)

    2、示例代码

    1. public class Person {
    2. private Integer id;
    3. private String name;
    4. public Integer getId() {
    5. return id;
    6. }
    7. public void setId(Integer id) {
    8. this.id = id;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public Person(Integer id,String name) {
    17. super();
    18. this.id=id;
    19. this.name=name;
    20. }
    21. @Override
    22. public String toString() {
    23. return "Person [id=" + id + ", name=" + name + "]";
    24. }
    25. public Person() {
    26. super();
    27. }
    28. }

      

    1. public class Test {
    2. public static void main(String[] args) throws ClassNotFoundException{
    3. Person p = new Person();
    4. Class clazz1=p.getClass();
    5. Class clazz2=Person.class;
    6. System.out.println(clazz1);
    7. System.out.println(clazz2);
    8. Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");
    9. System.out.println(clazz3);
    10. }
    11. }

    2.2 Class对象的获取方式

    1. 通过对获取Class对象的三种方式的实现,了解到,对同一个类来讲,不管用哪种方式获取Class对象,获取到的Class对象是唯一的,满足单例模式。
    2. 源码:
    1. public class Test {
    2.         public static void main(String[] args) throws ClassNotFoundException{
    3.                 Person p = new Person();
    4.                 Class clazz1=p.getClass();
    5.                 Class clazz2=Person.class;
    6.                 System.out.println(clazz1==clazz2);
    7.                 Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");
    8.                 Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");
    9.                 System.out.println(clazz3==clazz4);
    10.         }
    11. }

    2.3基本数据类型的Class对象

    1、概念

    java从大的方面分类,一个是基本数据类型,一个是复合数据类型,java当中的基本数据类型有:boolean  int  short  byte  char  long  float 和 double 它们也有各自的Class对象

    例如:int.class

    void也有自己对于的Class对象(void.class)

    基本数据类型对应的封装类有属性TYPE(常量),这个属性代表了封装类所封装的基本数据类型的Class对象。

    Int.class==Integer.TYPE

    void.class==Void.TYPE

    代码

    1. System.out.println(int.class==Integer.TYPE);
    2. System.out.println(boolean.class==Boolean.TYPE);
    3. System.out.println(float.class==Float.TYPE);
    4. System.out.println(void.class.getName());

    //表示对应数据类型的封装类可以表示基本数据类型的Class对象

    2.4 反射的基本概念

    1. 概念

    反射就是把java类中的各个组成部分映射成相应的java类

    一个类的组成部分包括:属性、方法、构造方法、包等,这些组成部分都会被映射成相应的类。

    Class类定义了一系列方法来获取java类的属性、方法、构造方法、包等信息,这些信息都有相应的来表示,分别是Field、Method、Constructor、Package等。

    java.lang.Class:代表一个类

    java.lang.reflect.Method:代表类的方法

    java.lang.reflect.Field:代表类的成员变量

    java.lang.reflect.Constructor:代表类的构造器

    注意:表示java类组成部分的各种类位于java.lang.reflect包

    1. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    2. 对于任意一个对象,都能够调用它的任意一个方法和属性;
    3. 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    当要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。

    通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

    2.5 Class对象的基本使用-1

    要进行反射操作必须要拿到这个类对应的Class对象

    1. Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");
    2. Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");
    3. Package p=clazz3.getPackage();
    4. System.out.println(p.getName());
    5. Constructor con1=clazz3.getConstructor();//得到构造方法
    6. System.out.println(con1.getName());//拿到构造方法的名称
    7. Person person1=(Person) con1.newInstance();//通过无参构造方法创建对象1
    8. System.out.println(person1);
    9. Person person2=(Person) con1.newInstance();//通过无参构造方法创建对象2
    10. System.out.println(person2);

    通过构造方法创建的两个对象的hash code编码是不一样的说明是创建了两个不同类型的对象

    本次主要学习了通过反射如何得到包的信息,和得到对应的构造方法的信息

    2.6 Class对象的基本使用-2

    一个类可能会定义多个重载的构造方法,当定义有参构造时,在创建对象时可以加入参数

    1. Class clazz3=Class.forName("cn.edu.xync.myweb.reflect.Person");
    2. Class clazz4=Class.forName("cn.edu.xync.myweb.reflect.Person");
    3. Package p=clazz3.getPackage();
    4. System.out.println(p.getName());
    5. Constructor  con3=clazz3.getConstructor(Integer.class,String.class);//得到一个带有参数的构造方法(通过反射的方式创建)
    6. Person p3=(Person)con3.newInstance(100,"小明");//创建对象并传入参数
    7. System.out.println(p3);

    1. Constructor[] con=clazz3.getConstructors();
    2. for(Constructor con4:con) {
    3. System.out.println(con);
    4. }
    5. //通过Constructors可以得到Person类中的所有构造方法,再通过for循环来遍历输出每个构造方法

    newInstance()和new()区别:

    1. 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类。
    2. newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过

    3、new是一个关键字;而newInstance是Class类中的一个方法,并且应用到了反射机制,相当于逆向创建对象,而new则是顺序创建对象。

  • 相关阅读:
    【MySQL】数据库基础
    Docker 相关配置文件路径
    ssm+jsp学分置换管理系统maven idea项目
    Linux配置腾讯云yum源(保姆级教学)
    CANoe创建仿真工程
    上班都在刷八股文,老板都想要一份?Alibaba 架构师的”Java 面试突击手册“到底有多火?
    基于python的urllib 库抓取网站上的图片
    python向word中添加表格
    【唐山海德教育】什么是安全员证书,有哪些分类?
    rsync远程同步
  • 原文地址:https://blog.csdn.net/Z_DOUBLE_Y/article/details/136568781