认识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
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]放入参数最多的构造方法,依次降序。
以上操作比起第一种来说,相对比较复杂,应此在开发中为了简便,建议保留无参构造方法。