Java Reflection深入理解构造器(Constructor)
2018-02-22 22:08
513 查看
利用Java的反射机制你可以检查一个类的构造方法,并且可以在运行期创建一个对象。
这些功能都是通过java.lang.reflect.Constructor这个类实现的。
获取Constructor对象
通过Class对象来获取Constructor类的实例:
Class myClass = ...//获取Class对象
Constructor[] constructors = myClass.getConstructors(); // 根据Class对象获取Constructor数组
返回的Constructor数组包含每一个声明为公有的(Public)构造方法。
以下所有实例涉及到的MyObject.java类:
eg:
如果你知道你要访问的构造方法的方法参数类型,可以通过指定构造器参数类型列表来获取构造器:
Class myClass = ...//获取Class对象
Constructor constructor = myClass.getConstructor(new Class[]{String.class}); // 获取参数为String类型的构造器
如果没有指定的构造方法能满足匹配的方法参数则会抛出:NoSuchMethodException。
eg:
构造方法参数
你可以通过如下方式获取指定构造方法的方法参数信息:
Constructor constructor = ... //获取Constructor对象
Class[] parameterTypes = constructor.getParameterTypes();
eg:
注意: 如果是无参构造器,constructor.getParameterTypes()获取返回值为空
利用Constructor对象实例化一个类,可以通过如下方法实例化一个类:
Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");
constructor.newInstance()方法的方法参数是一个可变参数列表,
但是当你调用构造方法的时候你必须提供精确的参数,即形参与实参必须一一对应。
在这个例子中构造方法需要一个String类型的参数,那我们在调用newInstance方法的时候就必须传入一个String类型的参数。
eg:
这些功能都是通过java.lang.reflect.Constructor这个类实现的。
获取Constructor对象
通过Class对象来获取Constructor类的实例:
Class myClass = ...//获取Class对象
Constructor[] constructors = myClass.getConstructors(); // 根据Class对象获取Constructor数组
返回的Constructor数组包含每一个声明为公有的(Public)构造方法。
以下所有实例涉及到的MyObject.java类:
package com.lanhuigu.reflect.common; public class MyObject { /** 属性 */ private String userName; private String password; /** 构造器 */ public MyObject() { } public MyObject(String userName) { this.userName = userName; } public MyObject(String userName, String password) { this.userName = userName; this.password = password; } /** getter and setter methods */ public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
eg:
package com.lanhuigu.reflect.constructors; import com.lanhuigu.reflect.common.MyObject; import java.lang.reflect.Constructor; public class Test2 { public static void main(String[] args) { Class myClass = MyObject.class; Constructor[] constructors = myClass.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); } } }
如果你知道你要访问的构造方法的方法参数类型,可以通过指定构造器参数类型列表来获取构造器:
Class myClass = ...//获取Class对象
Constructor constructor = myClass.getConstructor(new Class[]{String.class}); // 获取参数为String类型的构造器
如果没有指定的构造方法能满足匹配的方法参数则会抛出:NoSuchMethodException。
eg:
package com.lanhuigu.reflect.constructors; import com.lanhuigu.reflect.common.MyObject; import java.lang.reflect.Constructor; public class Test3 { public static void main(String[] args) throws NoSuchMethodException { Class myClass = MyObject.class; Constructor constructor = myClass.getConstructor(new Class[]{String.class}); } }
构造方法参数
你可以通过如下方式获取指定构造方法的方法参数信息:
Constructor constructor = ... //获取Constructor对象
Class[] parameterTypes = constructor.getParameterTypes();
eg:
package com.lanhuigu.reflect.constructors; import com.lanhuigu.reflect.common.MyObject; import java.lang.reflect.Constructor; public class Test4 { public static void main(String[] args) throws NoSuchMethodException { /** 获取Class对象 */ Class myClass = MyObject.class; /** 获取对象中所有构造器 */ Constructor[] constructors = myClass.getConstructors(); /** 遍历构造器 */ for (int i = 0; i < constructors.length; i ++) { Constructor constructor = constructors[i]; System.out.println("###########第"+(i+1)+"个构造器--start--###########"); /** 获取构造器中参数列表 */ Class[] parameterTypes = constructor.getParameterTypes(); for (Class type : parameterTypes) { /** 循环打印构造器参数类型 */ System.out.println("构造器参数类型:"+type.getName()); } System.out.println("###########第"+(i+1)+"个构造器--end--###########"); } } }
注意: 如果是无参构造器,constructor.getParameterTypes()获取返回值为空
利用Constructor对象实例化一个类,可以通过如下方法实例化一个类:
Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");
constructor.newInstance()方法的方法参数是一个可变参数列表,
但是当你调用构造方法的时候你必须提供精确的参数,即形参与实参必须一一对应。
在这个例子中构造方法需要一个String类型的参数,那我们在调用newInstance方法的时候就必须传入一个String类型的参数。
eg:
package com.lanhuigu.reflect.constructors; import com.lanhuigu.reflect.common.MyObject; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Test5 { public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { /** 根据参数类型获取构造器 */ Constructor constructor = MyObject.class.getConstructor(new Class[]{String.class}); /** 根据构造器动态创建对象实例 */ MyObject myObject = (MyObject) constructor.newInstance("hello world"); /** 调用对象中属性的getter方法 */ System.out.println("userName:" + myObject.getUserName()); } }
相关文章推荐
- Java Reflection深入理解Class对象
- Java Reflection深入理解数组(Array)
- java的Constructor(构造器)的理解
- java的Constructor(构造器)的理解
- java的Constructor(构造器)的理解
- Java构造器的深入理解
- java的Constructor(构造器)的理解
- java的构造器Constructor的理解
- Java Reflection深入理解私有变量和私有方法
- Java Reflection深入理解泛型(generics)
- java的Constructor(构造器)的理解
- java的Constructor(构造器)的理解
- java的Constructor(构造器)的理解
- java 深入理解自定义类 、构造器 、显式参数与隐式参数
- Java Reflection深入理解变量(Field)
- Java Reflection深入理解方法(Method)
- java的Constructor(构造器)的理解
- Java Reflection深入理解动态代理(Proxy)
- java的Constructor(构造器)的理解
- 关于java构造器的理解(Constructor)