且将新火试新茶,诗酒趁年华。
概述
Class
是一个位于java.lang
包下面的一个类,在Java
中每个类实例都有对应的Class
对象。类对象是由Java虚拟机(JVM)自动构造的。
Class
类的方法经常在反射时被调用。
创建Class对象
有三种方法可以创建Class对象
Class.forName(“className”)
:因为Class
类没有公共的构造方法,所以存在一个静态的方法返回Class
对象,即Class.forName()
用于创建Class
对象。要创建的Class
对象的类名在运行时确定,不存在则抛出ClassNotFoundException
。(注意className
为类的完整包名)
Class.forName("java.lang.String")
Myclass.class
:当我们在类名后面跟上.class
时,就会返回当前类的Class
对象。它主要应用于原始数据类型,并且仅在我们知道类的名称时才使用。要创建的Class
对象的类名在编译时确定
Class c2 = String.class;
请注意,此方法与类名一起使用,而不是与类实例一起使用
A a = new A(); // Class A 的实例a
Class c = A.class; // 正确用法
Class c = a.class; //编译出错
obj.getClass()
: 此方法存在时Object
类中,它返回此obj
对象的运行时类。
String str = new String("string");
Class c3 = str.getClass();
Class对象里面的方法
String toString()
此方法将Class
对象转换为字符串。它返回字符串表示形式,即字符串“class”或“interface”,后跟空格,然后是类的含包名名称。如果Class
对象表示基本类型,则此方法返回基本类型的名称,如果它表示void
,则返回“void”
描述:
语法 :
public String toString()
参数 :
NA
返回 :
a string representation of this class object.
重写 :
toString in class Object
测试类:
public class ToStringTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
Class c2 = int.class;
Class c3 = void.class;
System.out.println("Class represented by c1: "+c1.toString());
System.out.println("Class represented by c2: "+c2.toString());
System.out.println("Class represented by c3: "+c3.toString());
}
}
输出:
Class represented by c1: class java.lang.String
Class represented by c2: int
Class represented by c3: void
String toGenericString()
返回描述此类的字符串,包括有关修饰符和类型参数的信息。
描述:
语法 :
public String toGenericString()
参数 :
NA
返回 :
a string describe of this class object.
测试类:
public class ToGenericStringTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
Class c2 = int.class;
Class c3 = void.class;
System.out.println("Class represented by c1: "+c1.toGenericString());
System.out.println("Class represented by c2: "+c2.toGenericString());
System.out.println("Class represented by c3: "+c3.toGenericString());
}
}
输出:
Class represented by c1: public final class java.lang.String
Class represented by c2: int
Class represented by c3: void
Class<?> forName(String className)
返回与给定字符串名称的类或接口相关联的 类对象。
描述:
语法 :
public static Class<?> forName(String className) throws ClassNotFoundException
参数 :
className -含包名
返回 :
返回指定包名的class对象
异常:
ClassNotFoundException
......
测试类:
public class ToClassForNameTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
}
}
输出:
Class<?> forName(String className,boolean initialize, ClassLoader loader)
使用给定的类加载器返回与给定字符串名称的类或接口相关联的类对象。如果参数loader为空,则通过引导类加载器加载该类。只有当initialize参数为true并且尚未被初始化时,该类才被初始化。
描述:
语法 :
public static Class<?> forName(String className,boolean initialize, ClassLoader loader)
throws ClassNotFoundException
参数 :
className -含包名
initialize - 如果true该类将被初始化。
loader - 类加载器
返回 :
返回指定包名的class对象
异常:
ClassNotFoundException
......
测试类:
public class ToClassForNameTest {
public static void main(String[] args) throws ClassNotFoundException {
Class myClass = Class.forName("Test");
ClassLoader loader = myClass.getClassLoader();
Class c = Class.forName("java.lang.String",true,loader)
}
}
输出:
T newInstance()
此方法创建此Class对象表示的类的新实例。通过具有空参数列表的新表达式创建类。如果尚未初始化,则初始化该类。
描述:
语法 :
public T newInstance() throws InstantiationException,IllegalAccessException
参数 :
NA
返回 :
由此对象表示的类的新分配实例
异常:
IllegalAccessException
......
测试类:
public class NewInstanceTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
Object instance = c1.newInstance();
System.out.println("instance class : " + instance.getClass());
}
}
输出:
instance class : class java.lang.String
boolean isInstance(Object obj)
此方法确定指定的Object是否与此Class表示的对象分配兼容。它相当于java
中的instanceof
运算符
描述:
语法 :
public boolean isInstance(Object obj)
参数 :
obj - the object to check
返回 :
true if obj is an instance of this class else return false
异常:
测试类:
public class IsInstanceTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("java.lang.String");
String url = "http://niocoder.com";
int i = 10;
boolean b1 = c.isInstance(url);
boolean b2 = c.isInstance(i);
System.out.println("is url instance of String : " + b1);
System.out.println("is i instance of String : " + b2);
}
}
输出:
is url instance of String : true
is i instance of String : false
boolean isAssignableFrom(Class<?> cls)
此方法确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是超类或超接口。
描述:
语法 :
public boolean isAssignableFrom(Class<?