一、问题描述:
在下面这段示例练习过程中,当使用注释中的if...else if...else的代码时,在eclips中运行始终在 System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");处死循环。
二、问题查找:
(1)认为是"constructor.setAccessible(true);"语句没有起到作用,debug后没有发现有任何问题;
(2)认为是获取对象的语句.forName()没有获取到Class对象,改为.getClass()后问题依然;
(3)书上说.getDeclaredConstructors()返回所有的构造方法,顺序是按照声明的顺序,也就是按照Example_01(String...string)、Example_01()和Example_01(String ,int)的顺序返回,为了验证,遍历输出了所有的构造方法,发现输出的顺序与书本说的顺序正好相反Example_01(String ,int)、Example_01()和Example_01(String...string);(哭死了,这是万万没想到的,一个礼拜的纠结终于有点眉目了),又看了下API文档,关于.getDeclaredConstructors()是这样说的:
public Constructor<?>[] getDeclaredConstructors()  throws SecurityException
Returns an array of Constructor objects reflecting all the constructors declared by the class represented by this Class object. These are public, protected, default (package) access, and private constructors. The elements in the array returned are not sorted and are not in any particular order. If the class has a default constructor, it is included in the returned array. This method returns an array of length 0 if this Class object represents an interface, a primitive type, an array class, or void.
橙色句子意思是,数组中返回的元素不会被分类或者按特定顺序排列,那我就纳闷了,为什么会和Example_01中构造方法定义的顺序正好相反呢?这个问题还需要有大神给解答一下。
三、问题解决:
发现顺序问题后,对if...else if...else的代码按照遍历时构造方法输出的顺序进行赋值,运行,问题解决;(乐死我了,哈哈哈)
四、后续思考:
(1)如果改变Example_01中3个构造方法的先后顺序,程序再次报错,原因是一样的,如何修改能让程序的运行不受构造方法顺序的影响?
(2)根据3个构造方法的不同,主要是参数个数不同,增加了参数数量判断,然后进行赋值,修改后运行,问题解决。
(3)如果构造方法中有参数数量相同的,例如在Example_01类中再增加一个构造方法Example_01(int, String),再次运行程序,问题再次出现。当一个重载方法被调用时,java通常在调用方法的参数和方法的自变量之间寻找匹配,但是会抛出IllegleArgumentException的异常,由于程序中对Exception进行了捕获,一旦出现异常,java就跳过另外一个赋值语句,直接运行到catch中去了。如何能够完美的解决这个问题还需要大神来解答一下了。
package major;
import java.lang.reflect.*;
public class Main_01 {
private static Object[] parameters;
public static void main(String[] args) throws Exception{
//Example_01 example=new Example_01();                         //实例化一个Example_01
Class exampleC=Class.forName("major.Example_01")    ;                        //获取Example_01的类型对象
//Class exampleC=example.getClass();
Constructor[] declaredConstructors=exampleC.getDeclaredConstructors();     //获取所有构造方法,按声明顺序返回
//遍历所有的构造方法及其参数的个数并进行输出
for (int i = 0; i < declaredConstructors.length; i++) {
System.out.println(declaredConstructors[i].toString());
System.out.println(declaredConstructors[i].getParameterTypes().length);
}
for(int i=0;i<declaredConstructors.length;i++){
Constructor constructor=declaredConstructors[i];
System.out.println(constructor.toString());
System.out.println("查看是否允许带有可变数量的参数:"+constructor.isVarArgs());
System.out.println("该构造方法的入口参数类型依次为:");
Class[] parameterTypes=constructor.getParameterTypes();
for(int j=0;j<parameterTypes.length;j++){
System.out.println(" "+parameterTypes[j]);
}
System.out.println("该构造方法可能抛出的异常类型为:");
Class[] exceptionTypes=constructor.getExceptionTypes();
for(int j=0;j<exceptionTypes.length;j++){
System.out.println(" "+exceptionTypes[j]);
}
Example_01 example2=null;
while(example2==null){
try {
/*if(i==0){
Object[] parameters = new Object[]{new String[]{"100","200","300"}};
example2=(Example_01)constructor.newInstance(parameters);
}else if(i==1)
example2=(Example_01)constructor.newInstance("7",5);
else{
example2=(Example_01)constructor.newInstance();
}*/
if(parameterTypes.length==1){
Object[] parameters = new Object[]{new String[]{"100","200","300"}};
example2=(Example_01)constructor.newInstance(parameters);
}else if(parameterTypes.length==2){
example2=(Example_01)constructor.newInstance("7",5);
//example2=(Example_01)constructor.newInstance(5,"7");
}else{
example2=(Example_01)constructor.newInstance();
}
} catch (Exception e) {
System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
constructor.setAccessible(true);
}
}
example2.print();
System.out.println();
}
}
}
public class Example_01 {
String s;
int i, i2, i3;
private Example_01(String... strings) throws NumberFormatException {
if (0 < strings.length) {
i = Integer.valueOf(strings[0]);
}
if (1 < strings.length) {
i2 = Integer.valueOf(strings[1]);
}
if (2 < strings.length) {
i3 = Integer.valueOf(strings[2]);
}
}
// 定义无参构造方法
protected Example_01() {
}
// 定义有参构造方法
public Example_01(String s, int i) {
this.s = s;
this.i = i;
}
public void print() {
System.out.println("s=" + s);
System.out.println("i=" + i);
System.out.println("i2=" + i2);
System.out.println("i3=" + i3);
}

转载于:https://www.cnblogs.com/zhangrj9/p/9872627.html

关于反射中.getDeclaredContructor()返回构造方法顺序的问题(转)相关推荐

  1. Java反射中method.isBridge() 桥接方法

    Java反射中method.isBridge() 桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可 ...

  2. 在 Java 的反射中,Class.forName 和 ClassLoader 的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  3. 反射中getMethods 与 getDeclaredMethods 的区别

    public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法. public Method[] getDecla ...

  4. 反射中 BindingFlags标识

         为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static. 指定 BindingFlags.Public 可在搜索中包含公共成员. 指 ...

  5. 反射中getDeclaredConstructors和getConstructors两个方法的区别,然后setAccessible什么时候用,作用是什么?

    1. getDeclaredConstructors和getConstructors的区别 1.1 getDeclaredConstructors和getConstructors都能得到默认的publ ...

  6. JavaSE 反射中getDeclaredFiled,getField,setAccessible之间的关系和用法

    1.        首先明确一点,getDeclaredFiled()只能取得本类独有的成员字段,getField()能取得本类独有的成员字段+父类的成员字段 但 这些都只能是public的. 所谓不 ...

  7. 【学步者日记】C#反射中NonPublic和Instance需要一起使用

    完整链接请看: http://note.youdao.com/noteshare?id=f378d9a414e46893b0e300b017ed3655 ----------------------- ...

  8. java 反射 getclass_Java反射中的getClass()方法

    Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代 ...

  9. java反射中,Class.forName和classloader的区别

    http://blog.csdn.net/qq_27093465/article/details/52262340 转载于:https://www.cnblogs.com/newlangwen/p/7 ...

最新文章

  1. ASP.NET Core on K8S深入学习(7)Dashboard知多少
  2. java基础——Vector集合知识点
  3. 如何使用mock应对测试所需随机数据
  4. 【英语学习】【Level 07】U01 Making friends L3 Do you eat here a lot?
  5. 【Flink】FLink 反序列化空指针 java.lang.String.<init> SimpleStringSchema
  6. Coding WebIDE 开放支持第三方 Git 仓库
  7. 第34届越秀区青少年科技创新大赛_创客集结号上报名已开始啦
  8. 极客大学产品经理训练营 产品思维和产品意识(中) 第4课总结
  9. PASCAL VOC数据集简介
  10. python识别文字答题_头脑王者的Python答题助手——从OCR文字识别到Fiddler抓包
  11. wordpress 中 erphpdown 短代码
  12. 将html的echarts导入excel,echarts 数据 表格 excel-求Excel数据导入echarts实现成图的代码,不胜感激!...
  13. 魔兽争霸lostTemple地图
  14. 看到“东大研究生”吐槽华为cpu,海思,请知道的人科普一下吧,我抛砖引玉
  15. getMonth()方法
  16. 嵌入式软件未来发展趋势
  17. 高晓松自曝常被员工管 钉钉到底是反了老板还是员工?
  18. 解析新时代人工智能机器人的工作原理
  19. CTR模型:FNN模型
  20. 年底找工作,怎么解释离职的原因?

热门文章

  1. 如何在博客中插入数学公式
  2. 【Java从0到架构师】MyBatis - 增删改、动态 SQL
  3. Redis 中两种持久化机制详解
  4. 3张经典人事管理模板,HR都直呼很好用
  5. 我38岁,从外企技术高管到失业在家,只因为做错了这件事
  6. Linux修改后保存与不保存,强制退出vi与vi下查找命令关键步骤!
  7. spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)
  8. django3数据库设计之商城项目
  9. os库的基本使用(复习)
  10. python课程思维导图_零基础Python学习思维导图,记得收藏