天天看点

创建对象时,new和Class.newInstance() 以及Constructor.newInstance()区别,以及getDeclaredMethods和getMethods的区别

一、newInstance和new

用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制。在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。newInstance()在工厂模式里面用到。

Class.newInstance()的使用:

Class.forName("A").newInstance();
           

或者

A.class.newInstance();
           

区别:

(1)调用构造方法不同

      new关键字能调用任何构造方法。

      newInstance()只能调用无参构造方法。

(2)效率不一样

      new关键字是强类型的,效率相对较高。

      newInstance()是弱类型的,效率相对较低。

二、Class.newInstance()和Constructor.newInstance()

相同点:Class.newInstance()和Constructor.newInstance()都是通过反射来获取类的对象的。

不同点:

(1)调用构造函数不同

Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; 

Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。 

(2)调用构造函数是否私有不同

Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的; 

Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。 即设置:

Class clazzA=Class.forName("A");   
/*以下调用无参的、私有构造函数*/   
Constructor constructorA=c.getDeclaredConstructor();   
constructorA.setAccessible(true); //调用私有构造关键是设置这句代码  
           

(3)对异常的处理不同

Class.newInstance()对于捕获或者未捕获的异常均由构造器抛出;
Constructor.newInstance()通常会把抛出的异常封装成InvocationTargetException抛出;
           

三、getDeclaredMethods和getMethods的区别

getDeclaredMethods:可以拿到反射类中的公共方法、私有方法、保护方法、默认方法,但是不能获得其父类中的方法

getMethods:可以拿到反射类及其父类中的所有公共方法。

四、private修饰符、无修饰符、protected修饰符、public修饰符的区别

  • private: 只能通过同一个类或结构中的代码访问类型或成员。
  • 无修饰符: 被子类和同package的类访问
  • protected: 类或成员只能由同一个类中的代码访问,或者在从该类派生的类中访问。
  • public: 全都可以访问