• Java反射机制(创建Class对象的三种方式)


    Java反射机制(创建Class对象的三种方式)

    1:了解什么是反射机制?

    在通常情况下,如果有一个类,可以通过类创建对象;但是反射就是要求通过一个对象找到一个类的名称;

    2:在反射操作中,握住一个核心概念:

    一切操作都将使用Object完成,类,数组,的引用都可以使用Object进行接收;

    3:Class类:

    功能:

    通过一个实例化对象,找到一个类的完整信息;

    public final class Class<T>

    extends Object

    implements Serializable, GenericDeclaration, Type, AnnotatedElement

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    package cn.itcast;

    //声明X类

    class X {

          

    }

    public class ClassDemo01 {

         public static void main(String[] args) {

               //实例化X类对象

              X x = new X();

               //得到对象所在的类

              System. out.println(x.getClass().getName());

         }

    }

    打印结果:cn.itcast.X(包名.类)

      

    1:get.Class()方法:

    任何一个类如果没有声明继承自那个父类,默认继承Object类;

    返回Object运行时的类,返回值是Class类,此类就是反射的源头;

    public final Class<?> getClass()

    2:getName()方法:

    public String getName()

    以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称;

    3:传统方式和反射方式:

    传统方式:

    引入“包.类”的名称  ----- 通过new实例化  ------ 创建实例化对象

    反射方式:

    实例化对象  -----  getClass() ---- 得到完整的“包.类”名称

    4:结论

    所有类的对象实际上都是Class类的实例;

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    package cn.itcast;

    public class Person {

        private String name;

        private int age;

        private char sex;

        public Person() {

            super();

        }

        public Person(String name, int age, char sex) {

            super();

            this.name = name;

            this.age = age;

            this.sex = sex;

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public int getAge() {

            return age;

        }

        public void setAge(int age) {

            this.age = age;

        }

        public char getSex() {

            return sex;

        }

        public void setSex(char sex) {

            this.sex = sex;

        }

        @Override

        public String toString() {

            return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";

        }

    }

      

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    5:创建Class对象的三种方式:

    <br>package cn.itcast;

    public class ClassDemo02 {

          

         public static void main(String[] args) {

              Person p1 = new Person("小明" ,20,'男' );

              Person p2 = new Person("小红" ,23,'女' );

               

               //创建Class对象的方式一:(对象.getClass())

               Class class1 = p1.getClass();

              System. out.println(p1.getClass().getName());

               Class class2 = p2.getClass();

              System. out.println(class1 == class2 );

               

              System. out.println("==============================" );

               //创建Class对象的方式二:(类.class:需要输入一个明确的类)

               Class class3 = Person.class;

              System. out.println(class1 == class2);

               

              System. out.println("==============================" );

               //创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)

               //Class.forName()有异常:ClassNotFoundException

               

               Class class4 = null;

               try {

                  class4 = Class. forName("cn.itcast.Person");

              } catch (ClassNotFoundException e) {

                   // TODO Auto-generated catch block

                  e.printStackTrace();

              }

              System. out.println(class4 == class3);

         }

    }

    结论:

    Class类不能使用new来实例化对象,代表类的字节码.相同类别的对象的类字节码相同

    一个Class对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个

      

  • 相关阅读:
    转载:《TypeScript 中文入门教程》 16、Symbols
    转载:《TypeScript 中文入门教程》 15、可迭代性
    在 docker 中(linux 系统)运行 sql server
    遇到一个在 sql server 查询中,条件语句不区分大小写的问题
    设置 MySQL 的时区
    js 控制浏览器全屏显示
    使用 bat 获取当前系统 ip 地址并生成快捷方式
    在 WinForm 中使用 Anchor 对控件进行定位
    在 WinForm 中获取嵌入的资源
    在 WinForm 窗体设计器中引用 x64 格式的程序集会发生错误
  • 原文地址:https://www.cnblogs.com/libaowen609/p/12819722.html
Copyright © 2020-2023  润新知