`
啸笑天
  • 浏览: 3483169 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

17 透彻分析反射的基础_Class类

 
阅读更多

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

反射的基石—>Class

<!--[if !supportLists]-->一、<!--[endif]-->Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class

<!--[if !supportLists]-->二、<!--[endif]-->对比提问,众多的人用一个什么类表示?众多的Java类用一个什么类表示?

---àPerson

Java----àClass

<!--[if !supportLists]-->三、<!--[endif]-->对比提问,Person类代表人,他的实例对象就是张三、李四这样一个个具体的人,

Class类代表的是Java类,他的各个实例对象又分为什么呢??

*对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。

*一个类被类加载器加载到内存中,占用的一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中内容也是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?就是Class

四、如何得到各个字节码对应的实例对象Class类型)

1、类名.class        例如  System.class

2、对象.getClass()              例如  new Date().getClass()

3Class.forName(“类名”)     例如    Class.forName(“java,util.Date”)

五、九个预定义Class实例对象

1 public boolean isPrimitive()

判定指定的 Class 对象是否表示一个基本类型,即Class.isPrimitive()

有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名, booleanbytecharshortintlongfloat double

这些对象仅能通过下列声明为 public static final 的变量访问,也是使此方法返回 true 的仅有的几个 Class 对象。

2

Boolean.TYPE==boolean.class,Character.TYPE==char.class,Byte.TYPE==byte.class,Short.TYPE==short.class,Integer.TYPE=int.class,Long.TYPE==long.class,Float.TYPE==float.class, Double.TYPE==double.class, Void.TYPE==void.class

六、数组类型的Class实例对象

Class.isArray()

七、总之,只要是在源程序中出现的类型,都有各自的Class的实例对象,例如  int[] , void

八、一个奇怪的问题:加载了字节码,并调用了其getMethods之类的方法,但是没有看到类的静态代码块被执行,只有在第一个实例对象被创建时,这个静态代码才会被执行。准确的说,静态代码块不是在类加载时被调用的,而是第一个实例对象被创建时才执行的。

 

package com.zyj.day1;
public class ReflectTest {
   public static void main(String[] args) throws ClassNotFoundException {
      String str1="abc";
        //返回String的字节码
      Class  cls1=str1.getClass();
      Class cls2=String.class;
      Class cls3=Class.forName("java.lang.String");
      System.out.println(cls1==cls2);//true
      System.out.println(cls1==cls3);//true
     
      System.out.println(cls1.isPrimitive());//false    isPrimitive()是判断是否是基本类型的字节码
      System.out.println(void.class.isPrimitive());//true
      System.out.println(int.class.isPrimitive());//true
     
      System.out.println(int.class==Integer.class);//false
      System.out.println(int.class==Integer.TYPE);//true   TYPE是包装类型中的基本类型的字节码
     
      System.out.println(int[].class.isPrimitive());//false
      System.out.println(int[].class.isArray());//true
   }
}
 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java反射机制

    17_张孝祥Java高新技术_透彻分析反射的基础_Class类.rar 这个文件很可能深入讲解了如何使用`Class`类以及其相关的API,如`getConstructors()`用于获取类的所有公共构造器,`getDeclaredConstructors()`则会返回类的...

    Java反射常用机制

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。...在学习过程中,结合源码分析将使你对反射机制有更透彻的理解,同时工具的使用也能提升开发效率。

    泛型的反射分析代码可参考复杂未看懂

    对于题目中提到的"泛型的反射分析代码可参考复杂未看懂",可能是指具体的代码实现比较复杂,没有理解透彻。这可能涉及到对Java泛型和反射的深入理解,包括类型擦除、边界通配符、类型变量的实际类型等概念。如果遇到...

    scjp考试题目.rar

    9. **反射机制**:了解如何在运行时动态地获取类的信息并调用方法,以及Class类、Constructor类和Method类的使用。 10. **JVM和Java类加载器**:理解Java虚拟机的工作原理,包括类的加载、连接、初始化过程,以及类...

    Spring.3.x企业应用开发实战(完整版).part2

    7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 ...

    Spring3.x企业应用开发实战(完整版) part1

    7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 ...

    Java:准备OCPJP时做的一些java程序

    10. **反射**:Class类的使用,通过反射创建对象,调用方法,获取字段。 11. **网络编程**:Socket编程,理解TCP和UDP协议的区别,以及ServerSocket和Socket类的使用。 12. **JDBC**:数据库连接,执行SQL语句,...

Global site tag (gtag.js) - Google Analytics