透彻分析反射的基础_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 是否是数组 

    }
}

时间: 2024-11-05 04:57:20

透彻分析反射的基础_Class类的相关文章

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

oc中的oop基础及类的基本介绍

面向对象的(OOP)的基础知识 类(class):表示一组对象数据的结构体,对象通类来得到自身.类名首字母大写. 对象(objcet):是一种包含值和指向其类的隐藏指针的结构体.运行中的程序中通常会有n个对象,首字母不用大写. 实例(instance):是对对象的另一种称呼. 消息(message):是对象执行的操作,用于通知对象去做什么.对象接收到消息后,将查询相应的类,来执行正确的代码运行程序. 方法(method):j是为响应消息而运行的代码,这个以后在oop中会很常用.根据类的对象或消息

黑马程序员——黑马基础——File类,打印流

 黑马程序员--黑马基础--File类,打印流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一,File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递给流的构造函数. File类常见方法: 1,创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false. 和输出流不一样,输出流对象一建立创建文件.而且文件已经存在,

Java基础-Class类

java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识! java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息. 当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象对被装入类的详细信息进行访问. 简单的说,获取某一个类所对应的Class对象可以通过如下三种途径: 1. Object的ge

C#反射之基础应用实例总结

本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 , 在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将它生成为 reflectPrj .dll, 代码如下: using System; using System.Collections.Generic; using System.Text; namespace reflectPrj { /// <summary> /// 接口 /// </summary> publ

java反射(四)--反射与简单java类

一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简单java类的开发,那么也会面临非常麻烦的困难: 1 class Emp{ 2 private String ename; 3 private String job; 4 5 public void setEname(String ename) { 6 this.ename = ename; 7 }

2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译

原文:2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译 title author date CreateTime categories C# 性能分析 反射 VS 配置文件 VS 预编译 lindexi 2019-11-29 10:13:17 +0800 2018-10-15 20:48:40 +0800 C# 性能测试 本文分析在 C# 中使用反射和配置文件和预编译做注入的性能,本文的数据是为预编译框架,开发高性能应用 - 课程 - 微软技术暨生态大会 2018 - w

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

Java_反射_基础

1.第13讲 [01:15]Java 程序中获得 Class 对象通常有如下三种方式: 1.使用 Class 的 forName() 2.调用某个类的 class 属性 3.调用某个对象的 getClass() [01:33]演示(上面3中方式 分别演示) 1.[02:20]Class class1 = Class.forName("cn.hsp.reflection.Cat"); 2.[03:45]Class class2 = Cat.class; 3.[05:10] Cat cat