java 中newInstance()方法和new关键字的区别
作者:yangactive 发布时间:2023-11-25 07:17:26
标签:newInstance(),new
java 中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
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://yangactive.iteye.com/blog/1851502
0
投稿
猜你喜欢
- 引言:关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽。上次突然一个同事问了我jav
- 1 SharedPreferences 介绍SharedPreferences是使用键值对的方式来存储数据的SharedPreference
- 1.mkString()方法的使用:mkString(seq:String)方法是将原字符串使用特定的字符串seq分割。mkString(s
- MediaQuery通常情况下,不会直接将MediaQuery当作一个控件,而是使用MediaQuery.of获取当前设备的信息,用法如下:
- JAVA简单写学生信息管理系统,实现学生信息的输入、查询、修改、删除操作package Week;import jdk.internal.u
- 这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 本文实例讲述了java中Object类用法。分享给大家供大家参考。具体如下:1、Object类是所有java类的基类如果在类的声明中未使用e
- 一. Window 分类应用 Window(ApplicationWindow: 对应一个 Acitivity)
- 当我们开发spring web应用程序时,对于如 IOException , ClassNotFoundException 之类的检查异常,
- 一、interrupt的使用特点我们先看2个线程打断的示例首先是可打断的情况:@Testpublic void interruptedTes
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 前情提要我们上节内容学习了如何创建\注册\读取bean我们发现bean对象操作十分的繁琐!所以我们这个章节,就带大家来了解更加简单的bean
- strcpy函数详解如下1.函数介绍1.1.函数接口char * __cdecl strcpy(char * dst, const char
- Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。
- SpringBoot的持久化层可以是Spring内置的轻量级JdbcTemplate、也可以是Hibernate或Mybatis等等,只需要
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- java数据结构的堆什么是堆堆指的是使用数组保存完全二叉树结构,以层次遍历的方式放入数组中。如图:注意:堆方式适合于完全二叉树,对于非完全二
- 在导入studio工程的时候,进行sync的时候,提示Error:Configuration with name 'default&
- 前言java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也不能做出来非常好用,
- 无论哪种界面框架输入文本框都是非常重要的控件, 但是发现flutter中的输入框TextField介绍的虽然多,但是各个属性怎么组合满足需要