newInstance()方法和new关键字的区别

 

* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。

* 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

* 我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,

* 就必须保证:1、这个类已经加载;2、这个类已经连接了。

* newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 

* 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,

* 提供给了一种降耦(降低耦合度)的手段。

* 最后用最简单的描述来区分new关键字和newInstance()方法的区别:

*    newInstance: 弱类型。低效率。只能调用无参构造。

*    new: 强类型。相对高效。能调用任何public构造。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Field;

public class testInvoke {
	public void work(){
		System.out.println("-----------");
	} 
	public  testInvoke work(String a,Integer b){
		System.out.println(a + b);
		return this;
	}
	public void work(Integer b, int c ){
		System.out.println(b + c);
	}
	
	public static void main(String[] args) throws SecurityException, NoSuchMethodException, InstantiationException, 		IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		Class<?> clazz = testInvoke.class;
		//Class<?> clazz = Class.forName("invoke.testInvoke");
		//testInvoke tinvoke = new testInvoke(); Class<?> clazz = tinvoke.getClass(); 
		System.out.println(clazz);
		//如果源类的方法没有参数,则要用new Class[]{}
		Method method1 = clazz.getMethod("work", new Class[]{});
		Method method2 = clazz.getMethod("work", new Class[]{String.class, Integer.class}); 
		Method method3 = clazz.getMethod("work", new Class[]{Integer.class, int.class});
		Object invokeTest = clazz.newInstance();
		/*
		 *  Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,<br/>
		 *  如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,<br/>
		 *  如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回<br/>
		 */
		//invoke方法的第一个参数是源类的实例,第二个参数是实例的值
		Object result1 = method1.invoke(invokeTest, new Object[]{});
		Object result2 = method2.invoke(invokeTest, new Object[]{"aaaa",new Integer(10)});
		Object result3 = method3.invoke(invokeTest, new Object[]{3,new Integer(4)});
		System.out.println(result1);
		System.out.println(result2);
		System.out.println(result3);

		Method[] methods = clazz.getMethods();
		for(Method method : methods){
			System.out.println(method.getName());
		}
		
		Field[] fileds = clazz.getFields();
		for(Field filed: fileds){
			System.out.println(filed.getName());
		}
	}
}

 控制台信息:

class invoke.testInvoke

-----------

aaaa10

7

null

invoke.testInvoke@de6ced

null

work

[Ljava.lang.Class;@c17164

work

[Ljava.lang.Class;@1fb8ee3

work

[Ljava.lang.Class;@61de33

main

[Ljava.lang.Class;@14318bb

wait

[Ljava.lang.Class;@ca0b6

wait

[Ljava.lang.Class;@10b30a7

wait

[Ljava.lang.Class;@1a758cb

equals

[Ljava.lang.Class;@1b67f74

toString

[Ljava.lang.Class;@69b332

hashCode

[Ljava.lang.Class;@173a10f

getClass

[Ljava.lang.Class;@530daa

notify

[Ljava.lang.Class;@a62fc3

notifyAll

[Ljava.lang.Class;@89ae9e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值