5.通过class获取对象的构造函数并且通过构造函数实例化对象
一:获取构造方法
1.getConstructor();获取默认无参构造(不能获取private修饰的无参构造) 2..getConstructors()获取所有的public修饰的构造方法 3.getConstructor(String.class,int.class)获取指定参数的pulic构造方法
4.getDeclaredConstructors()获取所有构造包括private修饰的构造 5.getDeclaredConstructor(String.class,int.class,double.class)获取指定的私有构造方法
注意1.getDeclaredConstructor()如果不传入对应的参数则获取的是默认无参的构造方法(这个方法既可以获取public的无参也可以获取private的无参)
2如果用getConstructor()获取指定的私有构造会报错误:
Exception in thread "main" java.lang.NoSuchMethodException: javaInvoke.Emp.<init>(java.lang.String, int, double)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at javaInvoke.testInvokeDemo.main(testInvokeDemo.java:52)
二:通过构造方法进行实例化
constructor 对象调用方法newInstance(传入构造方法对应的参数); 注意如果是私有构造实例化需要在实例化之前 conPri.setAccessible(true);调用这个方法进行安全检查设定为允许否则会报如下错误:
Exception in thread "main" java.lang.IllegalAccessException: Class javaInvoke.testInvokeDemo can not access a member of class javaInvoke.Emp with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at javaInvoke.testInvokeDemo.main(testInvokeDemo.java:57)
DEMO案例如下:
package javaInvoke;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Emp{
public Emp(){
}
/*
private Emp(){
}
*/
public Emp(String name){
}
public Emp(String name,int items){
}
private Emp(String name,int items,double dou){
}
}
public class testInvokeDemo {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
/*获取对象的class字节码对象*/
Class<Emp> claz = Emp.class;
/*获取对象的无参构造*/
Constructor con = claz.getConstructor();
System.out.println(con+"无参构造");
/*获取对象所有public构造方法*/
Constructor[] cons = claz.getConstructors();
for(Constructor conc:cons){
System.out.println(conc+"所有public构造方法");
}
/*获取指定参数的构造方法*/
Constructor conn = claz.getConstructor(String.class,int.class);
System.out.println(conn+"获取指定参数的构造方法");
/*获取所有构造方法包括私有构造方法*/
Constructor[] cono=claz.getDeclaredConstructors();
for(Constructor cond:cono){
System.out.println(cond);
}
/*获取指定的私有构造方法*/
Constructor conPri1= claz.getDeclaredConstructor();
System.out.println(conPri1+"获取默认的构造方法");
Constructor conPri = claz.getDeclaredConstructor(String.class,int.class,double.class);
System.out.println(conPri+"获取私有构造");
/*允许不通过安全检查就可以用私有构造函数进行实例化对象*/
conPri.setAccessible(true);
/*通过构造实例化对象方法,传入构造方法对应的参数*/
Object obj = conPri.newInstance("反射",1,2.0);
System.out.println(obj.toString()+"通过反射获取的构造函数进行实例化");
}
}