`
小哥1900
  • 浏览: 56496 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学习Class类笔记

阅读更多
一. 对于Class类我之前一直只知道有这么一个类,至于它是用来干嘛的,它的特性又是什么,我一无所知。当我学到JDBC时,出现了以下语句:
Class.forName(“com.mysql.jdbc.Driver”);

这是利用JDBC访问数据库至关重要的第一步:调用Class.forName()加载并注册Mysql的驱动程序类,向其传递要加载的JDBC驱动的类名,在运行时,类加载器从CLASSPATH环境变量中定位和加载JDBC驱动类。
对以上红色字体中的解释我只能知道要利用JDBC连接数据库就必须有这么一步,但是对于Class类的特性我还是不能理解。
查API文档得知:
引用
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.

由以上API文档来理解,Class它和一般的classes一样都是继承自Object。它的实体(instance)用以表达Java程序运行时的classes和interface,也用来表达enum,array,primitive Java types(boolean,byte,char,short,int ,long.float,double)以及关键词void。
Class 没有公共构造函数。当一个class被加载时,或当加载器(class loader)的defineClass()被JVM(Java 虚拟机)调用,JVM自动产生一个Class Object。因此不能显式的声明一个Class对象。
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选准放正确方法去执行。用来保存这些类型信息的类就是Class类。Class类封装了一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
引用
虚拟机为每种类型管理一个独一无二的class对象。也就是说每个类型都有一个class对象。运行程序时,Java虚拟机首先检查所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
-------选自51CTO网站网友熔岩的博客文章《深入研究Java.lang.class类》

如何获得Class对象呢?有三种方法可以获取:
1. 调用Object类的getClass()方法来得到Class对象。如:
String str = “abc”;
Class c1 = str.getClass();
2. 使用Class类的静态方法forName(String str)方法获得与字符串对应的Class对象。如:
Class c2 = Class.froName(“MyClass”);MyClass必须是接口或者类的名字。
3. 第三种方法很简单,如果T是一个Java类型,那么T.class就代表了匹配的类对象。
如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;

二. 下面是我编来用来实验的小程序。
 
public class TestClass1 {
	public static void main(String[] args) throws ClassNotFoundException {
		Class cla = Class.forName("Test");
		System.out.println(cla.getClass().getName());
	}
}

class Test {
	private String str;
	public Test(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}
}

以上运行结果为:java.lang.Class.
进行以下实验:
1. 如果把Test类的定义注释。然后删掉之前产生的Test.class文件,再次编译运行,发现将会发生:ClassNotFoundException:Test。也就是找不到Test类。这是否就验证了forName(String str)方法中的字符串必须是一个类或接口的名字??。
2. 如果把Test类的定义去掉注释,再次编译运行,得出结果,同时产生Test.class文件。然后再把Test类的定义注释,编译运行,发现不会再发生异常,成功运行。这是否验证了前面所说的:运行程序时,Java虚拟机首先检查所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入??
之前运行时已经产生Test.class文件,所以把Test类的定义注释后,再编译运行,JVM根据类名能查找到到Test.class文件。
3. 如果在forName()方法中的字符串换成“String”。编译运行,发现同样发生ClassNotFoundException。当如果换成的是”java.lang.String”,则编译运行成功。这就再次验证了forName(String str)方法中的字符串必须是一个类或接口的名字,不管是Java API中封装好的,还是你自己定义的。



引用
参考:
1. Java API文档
2. 熔岩博客文章《深入研究java.lang.Class类》
3. 侯捷-Java反射机制

0
0
分享到:
评论

相关推荐

    JS.Class 学习笔记

    这篇学习笔记主要探讨了JS.Class如何利用JS.Module实现继承、方法查找以及模块的使用。 JS.Module在JS.Class中扮演着核心角色,它是一个可以存储方法的对象,用于组织和复用代码。你可以将一个JS.Module看作是一个...

    一个自己学习总结的php类学习笔记

    创建PHP类非常简单,使用`class`关键字,后跟类名。例如: ```php Class Person { var $name; var $age; } ``` 在这个例子中,我们定义了一个名为`Person`的类,包含了两个属性:`$name`和`$age`。 为了使用这些...

    Python学习笔记-10.类(Class)1.pdf

    在本篇Python学习笔记中,我们将深入探讨Python类的概念、特性以及如何使用它们。 首先,定义一个Python类非常简单,它使用关键字"class"。一个基本的类定义如下: ```python class MyClass: pass ``` 类中的...

    Java学习笔记及心得

    ### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...

    JAVA上课笔记class_18

    根据提供的文件信息,我们可以整理出以下关键知识点,主要聚焦于Java编程语言的基础学习与实践,以及构建工具Ant的使用。 ### Java基础知识 #### 单元测试基础 在Java开发过程中,单元测试是确保代码质量的重要...

    当年我学PHP时整理的学习笔记

    5. **class类.php**:介绍了面向对象编程的概念,包括类的定义、属性、方法、继承、封装和多态等。 6. **字符串处理.php**:可能包含各种字符串操作,如字符串比较、查找替换、格式化输出等。 7. **变量及常量.php**...

    j2se学习笔记——课堂笔记

    **J2SE学习笔记——接口与相关程序** Java 2 Platform, Standard Edition(J2SE)是Java平台的核心部分,提供了开发和运行桌面应用程序、Web应用程序和服务的基础。本笔记主要聚焦于J2SE中的接口(Interface)概念...

    c++学习笔记(个人学习时做的笔记)

    1. **类的概念(Concepts of Class)**:类是封装数据和行为的结构,是面向对象编程的基础。 2. **对象拷贝**:深拷贝和浅拷贝的区别,以及如何避免拷贝构造函数和赋值运算符的问题。 3. **分离声明与实现**:...

    php框架学习笔记.doc

    控制器是CI框架的核心组件,每个控制器都是一个类Class,类中每个函数function都是一个页面。在CI框架中,每个页面都需要通过控制器来加载。 CI框架的URI字符串具有唯一对应的控制器类和方法。控制器类的名称必须以...

    JAVA学习笔记

    笔记会解释如何使用Class类、Constructor类、Method类等进行反射操作。 8. **Java标准库**:Java SE标准库包含了大量的工具类和API,如Math、String、Date等,学习者需要了解并熟练运用这些类来解决问题。 9. **...

    Java学习超详细笔记

    ### Java学习超详细笔记 #### 面向对象编程基础 **面向对象编程**是一种编程范式,它强调使用对象来设计和实现软件系统。与传统的面向过程编程相比,面向对象编程更加强调数据和行为的封装,以及通过类和对象的...

    java李兴华学习笔记之Java常用类库

    ### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...

    java class文件格式学习笔记1

    这篇学习笔记主要探讨了Class文件的结构、内容和重要特性。 首先,Class文件是一种语言独立的存储格式,不仅用于Java,也可以支持其他如Scala等JVM为基础的语言。它由字节码构成,这种格式允许JVM执行不同语言编译...

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    Hibernate学习笔记特别详细

    《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...

    超详细ES6变动,ES6学习笔记,JavaScriptES6学习笔记

    本学习笔记将聚焦于与ES5的区别,帮助初学者快速掌握ES6的核心概念。** 1. **变量声明:let和const** - `let`替代了`var`进行块级作用域的变量声明,解决了`var`的变量提升和函数作用域问题。 - `const`用于声明...

    javase学习笔记(全)

    8. **反射机制**:反射允许程序在运行时动态地获取类的信息并操作类的对象,如Class类,Constructor类,Method类,Field类等。 9. **泛型**:泛型提高了代码的类型安全性和重用性,限制了集合中存储的元素类型。 ...

Global site tag (gtag.js) - Google Analytics