透彻分析反射的基础_Class类

简介: 一、反射的基石--->Class类 1. Java类用于描述一类事物的特性,该类事物有什么属性,没有什么属性,值域这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,他们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别哦。

一、反射的基石--->Class类

1. Java类用于描述一类事物的特性,该类事物有什么属性,没有什么属性,值域这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,他们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别哦。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属的包名,字段名称的列表,方法名称的列表,等等。学习反射,首先就要明白Class这个类。

 

  • Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class
    • public class Class
  • 对比提问:众多的人用一个什么类表示?众多的Java类用一个什么表示?
    • 人—>Person
    • Java类—>Class
  • 对比提问:Person类代表人,它的实例对象就是张三,李四这样一个个具体的人,Class类代表Java类,它的各个实例对象分别对应什么呢?
    • 对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。
    • 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里的内容就是字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间分别用一个个的对象来表示,这些对象显然具有同样的类型,这个类型是什么呢?
  • 如何得到各个字节码对应的实例对象(Class类型)
    • 类名.class,例如 System.class//通过类名得到字节码实例
    • 对象.getClass(),例如 new Date().getClass();//通过实例得到字节码实例
    • Class.forName("类名");     Class.forName("java.util.Date");//适合于类字节码尚未加载到内存的情况下
      • java.util.Date是一个字符串,如果事先不知道将加载哪个类,就传一个String,动态的加载字符串指定的类字节码。

 

  • 八个基本类型和void也对应表现为自己的Class字节码对象。
    • Class cls1=int.class;
    • Class cls2=void.class;

 

  • 数组类型 的Class实例对象
    • Class.isArray()
package com.itcast.day1;

public class ReflectTest { 
    public static void main(String[] args)throws Exception { 
        
        //分别用三种方式得到 String类在内存中的字节码 
        Class cls1=String.class;//01. 类名.class 
        
        String str="123"; 
        Class cls2=str.getClass();//02. 实例.getClass() 
        
        String classUrl="java.lang.String"; 
        Class cls3=Class.forName(classUrl);//03. Class.forName(类名) 
        
        //三种方法是得到了同一份字节码。 
        System.out.println(cls1 == cls2);//true 
        System.out.println(cls1 == cls3);//true 
        
        System.out.println(cls1.isPrimitive());//false,不是基本类型的字节码 
        System.out.println(int.class.isPrimitive());//true 基本类型的字节码 
        System.out.println(int.class == Integer.class);//false 基本类型和包装类型不是一份字节码 
        System.out.println(int.class == Integer.TYPE);//true Integer.TYPE就代表包装对应的基本类型的字节码 
        
        
        
        System.out.println(int[].class.isPrimitive());//false 数组也是一种类型,但不是基本类型 
        System.out.println(int[].class.isArray());//true 是否是数组 
        
    } 
}
开始做,坚持做,重复做
相关文章
|
5月前
|
安全 Java
Java反射-Class对象功能概述及反射案例
Java反射-Class对象功能概述及反射案例
41 1
|
2月前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
11 1
|
9月前
|
安全 Java API
AbstractStringBuilder类【JDK源码分析】
AbstractStringBuilder类【JDK源码分析】
66 0
|
5月前
|
设计模式 Java
java反射基础
本文主要针对java中的反射基础知识进行讲解
33 0
|
11月前
|
C++
C++类的学习1(一)
的定义一般包括两部分,一是类的属性,二是他所拥有的方法。类的实例化是指给类的加载并初始化过程,比如一个people类,我们具体到每一个人就是类的实例化,此外一个类可以在此类上进行扩展。比如people类,我们分为 外国people 和 中国people,那么people叫做基类,外国people叫做派生类或子类
|
11月前
|
C++
C++类的学习1(二)
的定义一般包括两部分,一是类的属性,二是他所拥有的方法。类的实例化是指给类的加载并初始化过程,比如一个people类,我们具体到每一个人就是类的实例化,此外一个类可以在此类上进行扩展。比如people类,我们分为 外国people 和 中国people,那么people叫做基类,外国people叫做派生类或子类
|
12月前
|
安全 Java 程序员
魔法反射--java反射初入门(基础篇)
反射被应用于许多方面, spring的注解, jdbc的连接都是基于反射来实现的, 可能在工作中我们很少能用到反射, 但是在面试的过程中面试官经常会问道, 可以不用反射, 但作为一个程序猿, 还是应该了解了解的
67 0
|
安全 Java 编译器
Java反射(Class类)常用方法(附Xmind整理)
Java反射(Class类)常用方法(附Xmind整理)
111 0
Java反射(Class类)常用方法(附Xmind整理)
|
Java
Java反射 - 基础篇
Java反射 - 基础篇
91 0
Java反射 - 基础篇