zoukankan      html  css  js  c++  java
  • 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对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个

      

  • 相关阅读:
    Codeforces #548 (Div2)
    Codeforces #550 (Div3)
    UVA
    ios 动画
    CAAnimation
    iOS三种定时器的用法NSTimer、CADisplayLink、GCD
    iOS使用宏写单例
    iOS完美的网络状态判断工具
    iOS开发
    iOS自定义控件教程:制作一个可重用的旋钮
  • 原文地址:https://www.cnblogs.com/libaowen609/p/12819722.html
Copyright © 2011-2022 走看看