Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100391
  • 博文数量: 54
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-30 00:36
文章分类

全部博文(54)

文章存档

2010年(1)

2009年(52)

2008年(1)

我的朋友

分类: Java

2009-10-07 11:52:35

在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() 调用类中缺省的构造方法,它的好处是:可以让我们在不知道一个类的名字的时候去创建一个类的实例。但是因为它只能调用缺省的构造方法,如果我们重写的构造方法,就会报错,因为我们可以用反身API去调用带参数的构造方法来创建一个对象。通过class反射API我们可以动态的加载一个类,动态的去创建一个类的实例,然后动态的调用这个类的方法。
 

 
import java.lang.reflect.*;
class ClassTest
{
 public static void main(String[] args)
 {
  /*Point pt=new Point();
  Class c1=pt.getClass();
  System.out.println(c1.getName());
  
  try
  {
   Class c2=Class.forName("Point");
   System.out.println(c2.getName());
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
  Class c3=Point.class;
  System.out.println(c3.getName());
  
  Class c4=int.class;
  System.out.println(c4.getName());
  
  Class c5=Integer.TYPE;
  System.out.println(c5.getName());
  
  Class c6=Integer.class;
  System.out.println(c6.getName());*/
  
  /*System.out.println("before new Point()");
  new Point();
  System.out.println("after new Point()");
  
  try
  {
   Class.forName("Line");
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }*/
  /*if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Point pt=(Point)c.newInstance();
   pt.output();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }*/
  
  if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Constructor[] cons=c.getDeclaredConstructors();
   /*for(int i=0;i   {
    System.out.println(cons[i]);
   }
   Method[] ms=c.getDeclaredMethods();
   for(int i=0;i   {
    System.out.println(ms[i]);
   }*/
   Class[] params=cons[0].getParameterTypes();
   Object[] paramValues=new Object[params.length];
   for(int i=0;i   {
    if(params[i].isPrimitive())
    {
     paramValues[i]=new Integer(i+3);
    }
   }
   Object o=cons[0].newInstance(paramValues);
   Method[] ms=c.getDeclaredMethods();
   ms[0].invoke(o,null);
  }
  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");
 }
}
阅读(578) | 评论(0) | 转发(0) |
0

上一篇:封装类

下一篇:Runtime类和Process类

给主人留下些什么吧!~~