8.21Java反射访问构造方法
2021/8/23 20:05:53
本文主要是介绍8.21Java反射访问构造方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
8.21Java反射访问构造方法
构造Constructor
类型的对象或者数组动态获取对象构造方法的信息
构造一个Constructor对象或者数组:
-
getConstructors()
-
getConstructor(Class<?>…parameterTypes)
-
getDeclaredConstructors()
-
getDeclaredConstructor(Class<?>...parameterTypes)
访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。
objectClass.getDeclaredConstructor(int.class,String.class); //入口参数类型依次为 int 和 String objectClass.getDeclaredConstructor(new Class[]{int.class,String.class}); //入口参数类型依次为 int 和 String
创建的每个 Constructor 对象表示一个构造方法,然后利用 Constructor 对象的方法操作构造方法:
方法名称 | 说明 |
---|---|
isVarArgs() | 查看该构造方法是否允许带可变数量的参数,如果允许,返回 true,否则返回 false |
getParameterTypes() | 按照声明顺序以 Class 数组的形式获取该构造方法各个参数的类型 |
getExceptionTypes() | 以 Class 数组的形式获取该构造方法可能抛出的异常类型 |
newInstance(Object … initargs) | 通过该构造方法利用指定参数创建一个该类型的对象,如果未设置参数则表示 采用默认无参的构造方法 |
setAccessiable(boolean flag) | 如果该构造方法的权限为 private,默认为不允许通过反射利用 netlnstance() 方法创建对象。如果先执行该方法,并将入口参数设置为 true,则允许创建对 象 |
getModifiers() | 获得可以解析出该构造方法所采用修饰符的整数 |
java.lang.reflect.Modifier
类可以解析出getMocMers()
方法的返回值所表示的修饰符信息。
静态方法名称 | 说明 |
---|---|
isStatic(int mod) | 如果使用 static 修饰符修饰则返回 true,否则返回 false |
isPublic(int mod) | 如果使用 public 修饰符修饰则返回 true,否则返回 false |
isProtected(int mod) | 如果使用 protected 修饰符修饰则返回 true,否则返回 false |
isPrivate(int mod) | 如果使用 private 修饰符修饰则返回 true,否则返回 false |
isFinal(int mod) | 如果使用 final 修饰符修饰则返回 true,否则返回 false |
toString(int mod) | 以字符串形式返回所有修饰符 |
示例:
int modifiers = con.getModifiers(); // 获取构造方法的修饰符整数 boolean isPublic = Modifier.isPublic(modifiers); // 判断修饰符整数是否为public string allModifiers = Modifier.toString(modifiers);
实例:
package PracticeReview.Reflect; import java.lang.reflect.Constructor; /** * 使用java.lang包下的方法去获取Practice类的信息 * @since JDK 1.8 * @date 2021/08/23 * @author Lucifer */ public class ReflectTest { public static void main(String[] args) { //动态获取ReflectPractice类 Class reflectPractice = PracticeReview.Reflect.ReflectPractice.class; //获取类下所以的构造方法 Constructor[] declaredContructors = reflectPractice.getDeclaredConstructors(); //遍历所有构造方法 for (int i=0; i<declaredContructors.length; i++){ Constructor con = declaredContructors[i]; // 判断构造方法的参数是否可变 System.out.println("查看是否允许带可变数量的参数:" + con.isVarArgs()); System.out.println("该构造方法的参数类型依次为:"); //获取所有参数类型 Class[] parameterType = con.getParameterTypes(); for (int j=0; j<parameterType.length; j++){ System.out.println(" " + parameterType[j]); } System.out.println("可能抛出的异常类型为:"); Class[] exceptionTypes = con.getExceptionTypes(); for (int j = 0; j < exceptionTypes.length; j++) { System.out.println(" " + exceptionTypes[j]); } // 创建一个未实例化的Book类实例 ReflectPractice book1 = null; while (book1 == null) { try { // 如果该成员变量的访问权限为private,则拋出异常 if (i == 1) { // 通过执行带两个参数的构造方法实例化book1 book1 = (ReflectPractice) con.newInstance("Java 教程", 10); } else if (i == 2) { // 通过执行默认构造方法实例化book1 book1 = (ReflectPractice) con.newInstance(); } else { // 通过执行可变数量参数的构造方法实例化book1 Object[] parameters = new Object[] { new String[] { "100", "200" } }; book1 = (ReflectPractice) con.newInstance(parameters); } } catch (Exception e) { System.out.println("在创建对象时拋出异常,下面执行 setAccessible() 方法"); con.setAccessible(true); // 设置允许访问 private 成员 } } book1.print(); System.out.println("=============================\n"); } } }
这篇关于8.21Java反射访问构造方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南