反射详解-通过Class实例化具体类的对象(无参数构造)

来源:互联网 发布:js判断变量是否未定义 编辑:程序博客网 时间:2024/06/10 15:49

国际惯例直接上代码

package com.riadu.test;/** * 手机模型 * @author www.riadu.com * @date 2012-07-25 */public class Mobile {private String size;//型号private String factory;//厂商public Mobile(){}public String getSize() {return size;}public void setSize(String size) {this.size = size;}public String getFactory() {return factory;}public void setFactory(String factory) {this.factory = factory;}}


测试类:

package com.riadu.test;/** * 测试类 * @author www.riadu.com * @date 2012-07-25 */public class Client3 {public static void main(String[] args) {Class<?> mob = null;try {mob = Class.forName("com.riadu.test.Mobile");} catch (ClassNotFoundException e) {e.printStackTrace();}Mobile mobile = null;try {//通过newInstance()实例化对象 通过无参构造实例化对象mobile = (Mobile) mob.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}mobile.setFactory("SAMSUNG");mobile.setSize("I9000");System.out.println(mobile.getFactory()+":"+mobile.getSize());}}


输出结果:SAMSUNG:I9000

API详解:

newInstance

public T newInstance()              throws InstantiationException,                     IllegalAccessException
创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。

注意,此方法传播 null 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。

返回:
此对象所表示的类的一个新分配的实例。
抛出:
IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。
InstantiationException - 如果此Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。
ExceptionInInitializerError - 如果该方法引发的初始化失败。
SecurityException - 如果存在安全管理器s,并满足下列任一条件:
  • 调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例
  • 调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包

 

原创粉丝点击