看了视频教程,说下面代码可以在不知道类名情况下,动态创建一个类的实例。 有点不解。  javac ClassTest.java
java ClassTest Point
public class ClassTest
{
  public static void main(String[] args)
  {
      
  if (args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Point pt=(Point)c.newInstance();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  }
}class Point
{
static
{
System.out.println("Loading Point");
}
}
(Point)c.newInstance() 这句叫“不知道类名的情况下”吗? 不都已经知道类名是“Point”了,要不怎么写强制类型转换。而且这命令 java ClassTest Point 若不知道类名也不好写呀!

解决方案 »

  1.   

    这里说的是反射的知识。他所说的“不知道类名情况下,动态创建一个类的实例”只得是c.newInstance() 这句话。在做这个操作的时候你是不知道要创建的类的类名的。至于后面转成Point,仅仅是例子的需要。在正常使用中不会这么转的,一般都是转成接口的类型或者是父类的,这样可以打破类定义和具体实现之间的耦合性,使得程序有很大的弹性。这项技术目前被广泛使用在各种Framework中,比如Spring中就大量的使用了反射。
      

  2.   

    "不知道类名的情况下"应该是指的实现不能明确要实例化的类名,但是是有条件的,即要实例化的类必须是Point的子类或者实现了某个接口.在这个例子中Point是一个具体类,那么如果有两个类,StartPoint extends Point/EndPoint extends Point,那么无论是指定名为StartPoint还是EndPoint都能实例化相应的类,因为他们都继承自Point.