在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例;
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
newInstance() 调用类中缺省的构造方法。
import java.lang.reflect.*;//java中的子包,是没有自动导入的,因此要在此处导入,用于映射API
class ClassTest
{
public static void main(String[] args)
{
if(args.length!=1)
{
return;
}
try
{
//通过映射API,使用类的自定义的构造函数和方法
Class c = Class.forName(args[0]);//得到类名
//使用反射API
Constructor[] cons = c.getDeclaredConstructors();//获得构造函数,用到lang.reflect包中的类,但是这个包没有自动导入
Class[] params = cons[0].getParameterTypes();//获得构造函数参数信息的类别
Object[] paramValues = new Object[params.length];
for (int i = 0; i < params.length; i++)
{
if (params[i].isPrimitive())//判断参数是不是基本数据类型
{
paramValues[i] = new Integer(i + 3);//给构造函数参数赋值
}
}
Object o=cons[0].newInstance(paramValues);//相当于Point(3, 4);
Method[] ms = c.getDeclaredMethods();//得到C类的方法
ms[0].invoke(o,null);//使用方法,对象为o,参数没有,相当于output();打印x=3,y=4
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
static//*****************************构造时就会自动打印
{
System.out.println("Loading Point");
}
int x,y;
void output()
{
System.out.println("x="+x+","+"y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
class Line
{
static//*****************************构造时就会自动打印
{
System.out.println("Loading Line");
}
}