认识Class类:

在正常情况下,需要先有一个类的完整路径引入之后才可以按照固定的格式产生实例化对象,但是在java中也允许通过一实例化对象找到一个类的完整信息,那么这就是Class

范例:

package com.testFS.test; 
/** 
* 通过一个对象得到完整的“包.类”名称:getClass().getname() 
* @author Administrator 
* 
*/ 
class Hello{ 
} 
public class GetClassDemo1 { 
public static void main(String[] args) { 
   Hello hello=new Hello();  System.out.println(hello.getClass().getName()); 
} 
}


类包路径:


结果:com.testFS.test.Hello


从程序的运行结果中可以发现,通过一个对象得到了完整的“包.类”名称,那么有些读者会觉得奇怪,getClass()方法是哪里定义的呢?从之前学习到的知识读者知道,任何一个类如果没有明确地声明继承哪个父类时候,则默认继承Object类,则可知道getClass()方法是Object类中的,定义如下:

public final Class getClass() 返回一个Class类,此类是Java 反射的源头。

图片理解反射过程:



提示:java中Object类是一切类的父类,那么所有类的对象实际也都是Java.lang.Class类的实例,所以所有的对象都可以转变为Java.lang.Class类型表示。

在定义Class类时也使用了泛型声明,所以为了让程序不很出现警告信息,可以指定好其操作的泛型类型。


Class类的作用:

Class 本身表示一个类的本身,通过Class可以完整地得到一个类中的完整结构,包括类中的定义、属性定义等。


Class类的常用方法:

java根据字符串反射对象变量性能消耗大么_类名




在Class类中本身没有定义任何的构造方法,所以如果要使用则首先必须通过forNmae()方法实例化对象。除此外,也可以用“类.class”或者“对象.getClass()”方法实例化。


范例:

package com.testFS.test; 

/** 
* 通过一个对象得到完整的“包.类”名称:getClass().getname() 
* @author Administrator 
* 
*/ 
class Hello{ 

} 
public class GetClassDemo1 { 
@SuppressWarnings("unused") 
public static void main(String[] args) { 
  //Hello hello=new Hello(); 
  //System.out.println(hello.getClass().getName()); 
  Class<?> c1=null; 
  Class<?> c2=null; 
  Class<?> c3=null; 
  try { 
   c1=Class.forName("com.testFS.test.Hello"); 
  } catch (ClassNotFoundException e) { 
   e.printStackTrace(); 
  } 
  c2=new Hello().getClass(); 
  c3=Hello.class; 
  System.out.println("类名称c1:"+ c1.getName()); 
  System.out.println("类名称c2:"+ c2.getName()); 
  System.out.println("类名称c3:"+ c3.getName()); 

} 
}


运行结果:

类名称c1:com.testFS.test.Hello

类名称c2:com.testFS.test.Hello

类名称c3:com.testFS.test.Hello


从程序的运行结果可以发现,三种实例化Class对象的方式是一样的,但是使用forName的静态方法实例化Class对象的方式是较为常用的一种方式,应重点掌握。


提示:使用forName()方法更加具有灵活性。

从以前程序的三种方法可以发现,出 forName()方法外,其他的两种:“对象.getClass()”,"类.class"都需要导入一个明确的类,如果一类操作不明确时,使用起来可能会受到一些限制。但是forName()传入时只需以字符串的方式传入即可,这样就让程序具备了更大的灵活性,所以此方法是最为常见的一种方式。