zoukankan      html  css  js  c++  java
  • 反射机制系列教材 (一)- Java反射机制教程-获取类对象

    类对象概念: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。

    步骤1:什么是类对象
    步骤2:获取类对象
    步骤3:获取类对象的时候,会导致类属性被初始化
    步骤4:练习-在静态方法上加synchronized,同步对象是什么?
    步骤5:答案-在静态方法上加synchronized,同步对象是什么?

    步骤 1 : 什么是类对象

    在理解类对象之前,先说我们熟悉的对象之间的区别:
    garen和teemo都是Hero对象,他们的区别在于,各自有不同的名称,血量,伤害值

    然后说说类之间的区别
    Hero和Item都是类,他们的区别在于有不同的方法,不同的属性

    类对象,就是用于描述这种类,都有什么属性,什么方法的

    步骤 2 : 获取类对象

    获取类对象有3种方式
    1. Class.forName
    2. Hero.class
    3. new Hero().getClass()

    在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。

    注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。因为还没有引入ClassLoader概念, 所以暂时不展开了。

    package reflection;

    import charactor.Hero;

    public class TestReflection {

        public static void main(String[] args) {

                String className = "charactor.Hero";

                try {

                    Class pClass1=Class.forName(className);

                    Class pClass2=Hero.class;

                    Class pClass3=new Hero().getClass();

                    System.out.println(pClass1==pClass2);

                    System.out.println(pClass1==pClass3);

                catch (ClassNotFoundException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

        }

    }

    步骤 3 : 获取类对象的时候,会导致类属性被初始化

    为Hero增加一个静态属性,并且在静态初始化块里进行初始化,参考 类属性初始化。 

    static String copyright;

    static {

        System.out.println("初始化 copyright");

        copyright = "版权由Riot Games公司所有";

    }


    无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)

    获取类对象的时候,会导致类属性被初始化

    package charactor;

    public class Hero {

        public String name;

        public float hp;

        public int damage;

        public int id;

        static String copyright;

        static {

            System.out.println("初始化 copyright");

            copyright = "版权由Riot Games公司所有";

        }

    }

    package reflection;

    import charactor.Hero;

    public class TestReflection {

        public static void main(String[] args) {

                String className = "charactor.Hero";

                try {

                    Class pClass1=Class.forName(className);

                    Class pClass2=Hero.class;

                    Class pClass3=new Hero().getClass();

                catch (ClassNotFoundException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

        }

    }


    更多内容,点击了解: https://how2j.cn/k/reflection/reflection-class/108.html

  • 相关阅读:
    public、private、protected继承的规则
    派生类对象的构造函数与析构函数
    类的保护成员
    派生类覆盖(修改)基类成员
    条款03:尽可能使用const
    处理类与类之间的关系
    继承派生基本概念
    条款02:尽量以const,enum,inline替换#define(宁可编译器替代预处理器)
    Redis持久化AOF和RDB对比
    Memcached取模算法
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615439.html
Copyright © 2011-2022 走看看