关于Java中类名.class的基础介绍

声明:文章的总结,来自许多网友的优秀博客

关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢

其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下:

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 得到类名(不包含包名)
		System.out.println(String.class.getSimpleName());// String
		// 得到类的全名称(包含所在的包名)
		System.out.println(String.class.getName());// java.lang.String
		System.out.println(Test.class.getName());// Test
	}
}

获取Calss对象的方式主要有三种:

第一种:通过Class.forName(“类的全名称”)获取,用这个方法,最常见的应该是应用于JDBC注册驱动的时候用到的

try {
		Class.forName("oracle.jdbc.driver.OracleDriver");// 注册驱动
} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
}

第二种:通过已经实例化的对象获取,getClass()方法获取

第三种:通过类名.class获取

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test test = new Test();
		System.out.println(test.getClass());// class Test
		System.out.println(Test.class);// class Test
	}
}

还在网友博客上看到一段比较不错的代码:贴之

import java.util.*;
  class Initable{
  static final int staticFinal = 47;
  static final int staticFinal2 = ClassInitialization.rand.nextInt(100);
  static{
  System.out.println("Initialization Initable");
  }
  }
  class Initable2{
  static int staticNoFinal = 147;
  static{
  System.out.println("Initialization Initable2");
  }
  }
  class Initable3{
  static int staticNoFinal = 74;
  static{
  System.out.println("Initialization Initable3");
  }
  }
  public class ClassInitialization
  {
  public static Random rand = new Randdom(47);
  public static void main(String[] args){
  Class initable = Initable.class; //不会引起初始化

  System.out.println("after creating Initable reference");
  System.out.println(Initable.staticFinal); //引用编译器常量不会引起初始化

  System.out.println(Initable.staticFinal2); //引起初始化

  System.out.println(Initable2.staticNoFinal); //引用非编译期常量会引起初始化

  Class initable3 = Class.forName("Initable3"); //默认会引起初始化

  System.out.println("after creating Initable3 reference");
  System.out.println(Initable3.staticNoFinal);//前面已经初始化此处不用再初始化

  }
  }

如果一个static final值是编译期常量,那么对该值的引用无需对其所在类进行初始化;若仅仅是static和final但不是编译期常量,则会引发初始化其类。若是引用一个static值则要进行链接并对其所在类进行初始化。

关于Java中类名.class的基础介绍

时间: 2024-10-07 01:07:41

关于Java中类名.class的基础介绍的相关文章

Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等(转)

Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互斥锁 / 读写锁 乐观锁 / 悲观锁 分段锁 偏向锁 / 轻量级锁 / 重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释. 公平锁 / 非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公

java中常见的rpc框架介绍

姓名:邓勇  班级:软件151 RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper).客户端和服务端可以运行在不同的JVM中,Client只需要引入接口,

java中的各种锁详细介绍

转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识.下面给出本文内容的总体分类目录: 1.

2.1号Java复习题目——Java中的字符串(基础知识整理)

Java中的字符串基础知识 作为程序开发当中,使用最频繁的类型之一,字符串有着与基础类型相同的地位,甚至在 JVM(Java 虚拟机)编译的时候会对字符串做特殊的处理,比如拼加操作可能会被 JVM 直接合成为一个最终的字符串,从而到达高效运行的目的. 1 String 特性 String 是标准的不可变类(immutable),对它的任何改动,其实就是创建了一个新对象,再把引用指向该对象: String 对象赋值之后就会在常量池中缓存,如果下次创建会判定常量池是否已经有缓存对象,如果有的话直接返

Java中实现异常处理的基础知识

异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. 源代码示例: package yanzheng; //关于异常  2015.11.11 import javax.swing.*; public class AboutException { public static void main(String[] args) { int i=1, j=0, k; //   k=i/j; 

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i

java中关于正则一些基础使用

这是本人的第一篇技术型博客,希望能帮到有需要的朋友.-----转载请注明出处. 在之前工作中,需要对很多字符串进行处理.我现在记录下来,以免以后遗忘. 对于正则处理相关的知识,我一开始是从网上找资料配合使用Java API1.6的一个中文版进行学习,很感谢翻译这个版本的团队(机构)或者个人,很感谢那些无私分享自己的知识的朋友. 下文中对于正则的相关知识,现在我是从oracle提供的最新的Java API,可能和以前我看得1.6有些出入,贴出API地址:http://docs.oracle.com

Java中的BigDecimal类用法介绍

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

java中类名.class, class.forName(), getClass()区别

Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象 3.实例对象.getClass()  说明:对类进行静态初始化.非静态初始化:返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)