查看: 618|回复: 0

[Java语言] java 中newInstance()方法和new关键字的区别

发表于 2017-10-3 13:33:32
尚学堂AD

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

* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
* 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
* 我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,
* 就必须保证:1、这个类已经加载;2、这个类已经连接了。
* newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
* 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,
* 提供给了一种降耦(降低耦合度)的手段。
* 最后用最简单的描述来区分new关键字和newInstance()方法的区别:
* newInstance: 弱类型。低效率。只能调用无参构造。
* new: 强类型。相对高效。能调用任何public构造。

代码如下:

  1. import java.lang.reflect.InvocationTargetException;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Field;
  4. public class testInvoke {
  5. public void work(){
  6. System.out.println("-----------");
  7. }
  8. public testInvoke work(String a,Integer b){
  9. System.out.println(a + b);
  10. return this;
  11. }
  12. public void work(Integer b, int c ){
  13. System.out.println(b + c);
  14. }
  15. public static void main(String[] args) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  16. Class<?> clazz = testInvoke.class;
  17. //Class<?> clazz = Class.forName("invoke.testInvoke");
  18. //testInvoke tinvoke = new testInvoke(); Class<?> clazz = tinvoke.getClass();
  19. System.out.println(clazz);
  20. //如果源类的方法没有参数,则要用new Class[]{}
  21. Method method1 = clazz.getMethod("work", new Class[]{});
  22. Method method2 = clazz.getMethod("work", new Class[]{String.class, Integer.class});
  23. Method method3 = clazz.getMethod("work", new Class[]{Integer.class, int.class});
  24. Object invokeTest = clazz.newInstance();
  25. /*
  26. * Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,<br/>
  27. * 如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,<br/>
  28. * 如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回<br/>
  29. */
  30. //invoke方法的第一个参数是源类的实例,第二个参数是实例的值
  31. Object result1 = method1.invoke(invokeTest, new Object[]{});
  32. Object result2 = method2.invoke(invokeTest, new Object[]{"aaaa",new Integer(10)});
  33. Object result3 = method3.invoke(invokeTest, new Object[]{3,new Integer(4)});
  34. System.out.println(result1);
  35. System.out.println(result2);
  36. System.out.println(result3);
  37. Method[] methods = clazz.getMethods();
  38. for(Method method : methods){
  39. System.out.println(method.getName());
  40. }
  41. Field[] fileds = clazz.getFields();
  42. for(Field filed: fileds){
  43. System.out.println(filed.getName());
  44. }
  45. }
  46. }
复制代码

控制台信息:

  1. class invoke.testInvoke
  2. -----------
  3. aaaa10
  4. 7
  5. null
  6. invoke.testInvoke@de6ced
  7. null
  8. work
  9. [Ljava.lang.Class;@c17164
  10. work
  11. [Ljava.lang.Class;@1fb8ee3
  12. work
  13. [Ljava.lang.Class;@61de33
  14. main
  15. [Ljava.lang.Class;@14318bb
  16. wait
  17. [Ljava.lang.Class;@ca0b6
  18. wait
  19. [Ljava.lang.Class;@10b30a7
  20. wait
  21. [Ljava.lang.Class;@1a758cb
  22. equals
  23. [Ljava.lang.Class;@1b67f74
  24. toString
  25. [Ljava.lang.Class;@69b332
  26. hashCode
  27. [Ljava.lang.Class;@173a10f
  28. getClass
  29. [Ljava.lang.Class;@530daa
  30. notify
  31. [Ljava.lang.Class;@a62fc3
  32. notifyAll
  33. [Ljava.lang.Class;@89ae9e
复制代码

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!



回复

使用道具 举报