new 对象和Class的getInstance()方法的差别?

创建对象时的差别

1、new 对象包含2步,

1)载入类;

2)而且实例化。

2、Class的对象.getInstance(),只不过实例化。

也就是说。在运行 Class的对象.getInstance() 之前一定要先载入相应的类。

//演示样例代码
/**
 * new 对象和Class的对象.getInstance()的差别?<p>
 * 答:<br>
 * 1、new 对象包含2步。<br>
 *    1)载入类。<br>
 *    2)而且实例化。<p>
 *
 * 2、Class的对象.getInstance(),只不过实例化。<br>
 *    也就是说。在运行 Class的对象.getInstance() 之前一定要先载入相应的类。<br>
 * @author gzh
 *
 */
public class Main1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		Word word = new Word();
//		ClassLoader classLoader = word.getClass().getClassLoader();
		ClassLoader classLoader = Word.class.getClassLoader();
		System.out.println(classLoader); //注:Word.class是由[email protected]载入器载入的

		try {
			Class<?> c = classLoader.loadClass(args[0]); //1、必需要先载入该类;

			Object o1 = c.newInstance(); //2、然后,才干够使用.newInstance()方法来新建实例对象。
			Object o2 = c.newInstance();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

详细应用上的差别

既然使用newInstance()构造对象的地方通过newkeyword也能够创建对象。为什么又会使用newInstance()来创建对象呢?

如果定义了一个接口Door,開始的时候是用木门的。定义为一个类WoodenDoor,在程序里就要这样写 Door door = new WoodenDoor() 。

如果后来生活条件提高。换为自己主动门了。定义一个类AutoDoor,这时程序就要改写为 Door door = new AutoDoor() 。

尽管仅仅是改个标识符,如果这种语句特别多,修改还是挺大的。于是出现了工厂模式,全部Door的实例都由DoorFactory提供。这时换一种门的时候。仅仅须要把工厂的生产模式改一下,还是要改一点代码。

而假设使用newInstance(),则能够在不改变代码的情况下。换为第二种Door。

详细方法是把Door的详细实现类的类名放到配置文件里,通过newInstance()生成实例。这样,改变第二种Door的时候。仅仅改配置文件就能够了。演示样例代码例如以下:

String className = 从配置文件读取Door的详细实现类的类名;

Door door = (Door) Class.forName(className).newInstance();

总结上面的3种情况例如以下。

1、直接new 对象。

2、使用接口。硬编码接口的实现类——假设要更改接口的实现类的话,则必需要改动源代码,而且又一次编译源代码。

3、使用接口。而且从配置文件获取接口的实现类——仅仅须要改动配置文件就可以。

时间: 2024-10-19 22:16:52

new 对象和Class的getInstance()方法的差别?的相关文章

给对象和函数添加method方法

蝴蝶书中有一个method方法,用来给函数定义方法.看了之后,想着能不能给对象也定义方法呢?. 下面的代码可以实现给函数定义方法: //Function method Function.prototype.method = function (name,func) { this.prototype[name] = func; return this; } 在实现给对象定义方法的过程中,我遇到了一些问题,对象是没有prototype的. 经过思考,用下面的方法实现了给对象定义方法的功能,但是比较繁

对象创建的两种方法

对象: 什么是对象呢?现实中的男女朋友?某一个事物的指代?那么在JS的函数中对象就是一组无序属性的集合. 对象的作用就是可以帮助我们封装一些数据,方便我们在程序中的传输或是控制,同时对象也可以帮我们描述一些事物:在JS中对象是有属性和方法组成的. 那么对象要怎么创建呢? 1.首先我们可以通过构造函数的方式创建自定义对象: 例: var student = new Object();  //创建了一个学生的空对象    // 属性(特征,姓名,性别,年龄,手机号,家庭)和方法(打招呼,游泳,打球)

Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:

直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 应用jQuery的扩展可以解决这个问题. $(document).ready(function(){ $.extend({  show:function(){   alert("ready");  }});setInterval("show()",3000);}); 方法2. 指定定时执行的函数时不要使用引号和括号.  $(function(){function show(){   al

为对象添加一个新的方法

例定义一个方法,为Date对象添加一个新的成员方法,转换为形如 y-m-d<br>h:m:s Date.prototype.stringify = function(){ var s= this.getFullYear()+'-'; s+= (this.getMonth()+1)+'-'; s+= this.getDate()+' '; s+= this.getHours()+':'; s+= this.getMinutes()+':'; s+= this.getSeconds(); retu

python的str,unicode对象的encode和decode方法

python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]. 而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]. 对于 s="你好" u=u"你好" s="你好" u=u"你好" 1. s.decode方法和u.enc

request对象的getAttribute()和getParameter()方法

HttpServletRequest类既有getAttribute()方法,也由 getParameter()方法,这两个方法有以下区别: (1)HttpServletRequest类有setAttribute()方法,而 没有setParameter()方法 (2)当两个Web组件之间为链接关系时,被链接的组件通过 getParameter()方法来获得请求参数,例如假定welcome.jsp和authenticate.jsp之间为链接关 系,welcome.jsp中有以下代码: <a hre

SQL Server中查询用户的对象权限和角色的方法

--SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_helpuser 'public' -- 查询哪些用户拥有指定的系统role exec sp_helpsrvrolemember 'sysadmin' -- 可查询嵌套role WITH tree_roles as ( SELECT role_principal_id, member_principa

使用反射构造对象实例并动态调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释如下: 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期

XE3随笔6:SuperObject 的 JSON 对象中还可以包含 &quot;方法&quot;

SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: ISuperObject; var Result: ISuperObject); //另外, 这是其数据类型的枚举: TSuperType = (stNull, stBoolean, stDouble, stInt, stObject, stArray, stString, stMethod); 测试代码: un