1.获取类的有关信息
Class是java.lang包中的类,该类的实例用来封装对象运行时的状态。
当一个类被加载且创建对象时,和该类相关的一个类型为Class的对象就会自动创建。
Class类本身不提供构造方法,因此,不能使用new运算符和构造方法创建一个Class对象。任何对象调用getClass()方法都可以获取一个和该对象相关的一个Class对象,这个对象可调用如下方法:
- String getName() :返回类的名字
- Constructor[] getDeclaredConstructors():返回类的全部构造方法
- Field[] getDeclaredFields():返回类的全部成员变量
- Method[] getDeclaredMethods():返回类的全部方法
例:
package ch4;
import java.lang.reflect.*;
class Rect{
double width, height, area;
public double getArea() {
area = width * height;
return area;
}
}
public class ClassExample{
public static void main(String args[]){
Rect rect = new Rect();
Class rectClass = rect.getClass();// 获取一个和该对象相关的一个Class对象
String className = rectClass.getName();// 返回类的名字
Constructor[] con = rectClass.getDeclaredConstructors();// 返回类的全部构造方法
Field[] field = rectClass.getDeclaredFields();// 返回类的全部成员变量
Method[] method = rectClass.getDeclaredMethods();// 返回类的全部方法
System.out.println("类的名字:" + className);
System.out.println("类中有如下成员变量:");
for (int i = 0; i < field.length; i++){
System.out.println(field[i].toString());
}
System.out.println("类中有如下方法:");
for (int i = 0; i < method.length; i++){
System.out.println(method[i].toString());
}
System.out.println("类中有如下构造方法:");
for (int i = 0; i < con.length; i++){
System.out.println(con[i].toString());
}
}
}
/*输出
类的名字:ch4.Rect
类中有如下成员变量:
double ch4.Rect.width
double ch4.Rect.height
double ch4.Rect.area
类中有如下方法:
public double ch4.Rect.getArea()
类中有如下构造方法:
ch4.Rect()
*/
2.使用Class实例化一个对象
为了得到一个类的对象,可以先得到一个和该类相关的Class对象:
就可以返回一个和参数className指定的类相关的Class对象。再让这个Class对象调用:
public static class forName(String className) throws ClassNotFoundException
就可以返回一个和参数className指定的类相关的Class对象。再让这个Class对象调用:
public Object newInstance() throws InstantiationException,IllegalAccess Exception
就可以得到一个className类的对象。(className类必须有无参数的构造方法)
例:
package ch4;
class Rect{
double width, height, area;
public double getArea(){
area = width * height;
return area;
}
}
public class ClassExample2{
public static void main(String args[]){
try{
Class cs = Class.forName("ch4.Rect");// 得到一个和Rect类相关的Class对象,要带上包名
Rect rect = (Rect) cs.newInstance();// 得到一个Rect类的对象
rect.width = 100;
rect.height = 200;
System.out.println("rect的面积" + rect.getArea());
}
catch (Exception e) {
}
}
}