Joyen.fu
日中则昃,月盈则食。

认识Class类

Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a running Javaapplication):
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

获取Class实例方式

方法1

在Object类中存在以下一个方法:

public final Class<?> getClass()

利用对象实例调用getClass()方法获得Class实例

1 package com.fwj.classdemo;
2 
3 public class PersonClassDemo {
4     public static void main(String[] args) {
5         Person per = new Person(); 
6         System.out.println(per.getClass().getName());
7     }
8 
9 }

方法2

运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
 1 package com.fwj.classdemo;
 2 
 3 public class PersonClassDemo {
 4 
 5     public static void main(String[] args) {
 6         Class<?> c = Person.class;
 7         Class<?> c2 = Integer.TYPE;
 8         System.out.println(c.getName());
 9         System.out.println(c2.getName());
10     }
11 }

方法3

使用Class类的静态方法forName(),用类的名字获取一个Class实例

public static Class<?> forName(String className) throws ClassNotFoundException

 1 package com.fwj.classdemo;
 2 
 3 public class PersonClassDemo {
 4 
 5     public static void main(String[] args) {
 6         Class<?> c = null;
 7         try {
 8             c = Class.forName("com.fwj.classdemo.Person");
 9         } catch (ClassNotFoundException e) {
10             // TODO Auto-generated catch block
11             e.printStackTrace();
12         }
13         System.out.println(c.getName());
14     }
15 }

 虽然有三种方法,但是最常用的是forName(),其次就是.class形式。

通过Class类实例化对象

在Class的使用中实例化对象是最常用的一种操作,框架的实现原理都是依靠Class类完成的。

实例化无参构造的类

通常是通过关键字new进行实例化,现在通过Class完成,按照以下步骤:

   1、实例化Class对象。

   2、通过Class类中的以下方法:

public T newInstance()throws InstantiationException,IllegalAccessException

 1 package com.fwj.classdemo;
 2 
 3 public class PersonClassDemo {
 4 
 5     public static void main(String[] args) {
 6         Class<?> c = null;
 7         try {
 8             c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
 9         } catch (ClassNotFoundException e) {
10             // TODO Auto-generated catch block
11             e.printStackTrace();
12         }
13         try {
14             Person p = (Person)c.newInstance();//获得实例
15             System.out.println(p);
16         } catch (InstantiationException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();19         } catch (IllegalAccessException e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         }
23     }
24 }

如果类中不存在无参构造方法则会出现以下异常:

java.lang.InstantiationException: com.fwj.classdemo.Person
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    at com.fwj.classdemo.PersonClassDemo.main(PersonClassDemo.java:14)

实例化指定构造的类

如果一个类中不存在无参的构造方法,则必须实例化指定的构造方法
如果想得到一个类的构造方法,可以使用Class类中的以下方法:

public Constructor<?>[] getConstructors()throws SecurityException

以上方法得到全部的构造,Constructor类定义在java.lang.reflect包中,属于反射操作的包。

取得一个构造方法之后可以,可以通过Constructor类中的以下方法进行实例化:

public T newInstance(Object... initargs)
              throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException

 1 package com.fwj.classdemo;
 2 
 3 import java.lang.reflect.Constructor;
 4 
 5 public class PersonClassDemo {
 6 
 7     public static void main(String[] args) throws Exception{
 8         Class<?> c = null;
 9         Person p = null;
10         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
11         Constructor<?> cons[] = c.getConstructors();//取得全部构造方法
12         p = (Person)cons[0].newInstance("fwj",23);
13         System.out.println(p);
14     }
15 }

如果存在多个构造方法,Constructor数组中构造方法按参数由多到少放入。例如cons[0]放入参数最多的构造方法,依次降序。

以上操作比起第一种来说,相对比较复杂,应此在开发中为了简便,建议保留无参构造方法。

posted on 2013-07-24 16:22  Joyen.fu  阅读(221)  评论(0编辑  收藏  举报