• JavaSE:反射机制


    反射机制 - Constructor类

    1.  基本概念

        java.lang.reflect.Constructor类:主要用于描述获取到的构造方法信息

    2.  Class类中,与Constructor类有关的常用方法

    Constructor getConstructor(Class<?>... parameterTypes) 用于获取此Class对象所表示类型中,参数指定的公共构造方法
    Constructor<?>[] getConstructors()  用于获取此Class对象所表示类型中,所有的公共构造方法

    3.  Constructor类的常用方法

    T newInstance(Object... initargs ) 使用此Constructor对象描述的构造方法,来构造Class对象代表类型的新实例
    int getModifiers() 获取方法的访问修饰符
    String getName() 获取方法的名称
    Class<?>[] getParameterTypes() 获取方法所有参数的类型

    4.  代码示例

      1 //  (假设已存在一个 Person.java 类  )
      2 
      3 class PersonConstructorTest {
      4 
      5     main() throws Exception {
      6 
      7       
      8 
      9       //  1.  使用原始方式,以无参形式,构造Person类型的对象,并打印
     10 
     11       Person p1 = new Person();
     12 
     13       print(“无参方式创建的对象是:” + p1);  //  null  0
     14 
     15  
     16 
     17       //  2.  使用反射机制,以无参形式,构造Person类型的对象,并打印
     18 
     19       //  创建对象的类型,可以从键盘输入
     20 
     21       //  print("请输入要创建对象的类型:");
     22 
     23       //  Scanner sc = new Scanner (System.in);
     24 
     25       //  String str1 = sc.next();
     26 
     27       //  Class c1 = Class.forName("com.lagou.task20.Person");
     28 
     29  
     30 
     31       //  创建对象的类型,可以从配置文件中读取
     32 
     33       BufferedReader br = new BufferedReader (new InputStreamReader(new FileInputStream("d:/a.txt ")));
     34 
     35       String str1 = br.readLine();
     36 
     37       Class c1 = Class.forName(str1);
     38 
     39       //  print("无参方式创建的对象是:" + c1.newInstance() );  //  null  0
     40 
     41       //  获取Class对象对应类中的无参构造方法,也就是Person类中的无参构造方法
     42 
     43       Constructor constructor = c1.getConstructor();
     44 
     45       //  使用获取到的无参构造方法,来构造对应类型的对象,也就是Person类型的对象
     46 
     47       print("无参方式创建的对象是:" + constructor.newInstance() );
     48 
     49       //  sc.close();
     50 
     51       br.close();
     52 
     53  
     54 
     55       //  3.使用原始方式,以有参方式,构造Person类型的对象,并打印
     56 
     57       Person p2 = new Person("zhangfei",30);
     58 
     59       print("有参方式构造的对象是:" + p2);   //  zhangfei  30
     60 
     61       
     62 
     63       //  4.使用反射机制,以有参方式,构造Person类型的对象,并打印
     64 
     65       //  获取Class对象对应类中的有参构造方法,也就是Person类中的有参构造方法
     66 
     67       Constructor constructor1 = c1.getConstructor(String.class, int.class);
     68 
     69       //  使用获取到的有参构造方法,来构造对应类型的对象,也就是Person类型的对象
     70 
     71       //  newInstance方法中的实参,是用于给有参构造方法的形参进行初始化的,也就是给name和age进行初始化的
     72 
     73       print("有参构造的对象是:" + constructor1.newInstance("zhangfei",30));  //  zhangfei  30  
     74 
     75  
     76 
     77       //  5.  使用反射机制,获取Person类中,所有的公共构造方法,并打印
     78 
     79       Constructor[] constructors = c1.getConstructors();
     80 
     81       for (Constructor ct: constructors) {
     82 
     83         print("构造方法的访问修饰符是" + ct.getModifiers() );
     84 
     85         print("构造方法的方法名称是" + ct.getName() );
     86 
     87         Class[] parameterTypes = ct.getParameterTypes();
     88 
     89         print("构造方法的所有参数类型是:");
     90 
     91         for (Class cs : parameterTypes) {
     92 
     93           print(cs + " ");
     94 
     95         }
     96 
     97         println();
     98 
     99       } 
    100 
    101     }
    102 
    103 }

    <1>  无参方式,构造对象

     <2>  有参方式,构造对象

     

    <3>  使用getConstructors(), 得到类中的所有构造方法

     1 // 5.使用反射机制获取Person类中所有的公共构造方法并打印
     2         Constructor[] constructors = c1.getConstructors();
     3         for (Constructor ct : constructors) {
     4             System.out.println("构造方法的访问修饰符是:" + ct.getModifiers());
     5             System.out.println("构造方法的方法名称是:" + ct.getName());
     6             Class[] parameterTypes = ct.getParameterTypes();
     7             System.out.print("构造方法的所有参数类型是:");
     8             for (Class cs : parameterTypes) {
     9                 System.out.print(cs + " ");
    10             }
    11             System.out.println();
    12             System.out.println("-------------------------------------------------");
  • 相关阅读:
    Android获取手机型号,系统版本,App版本号等信息
    RFC1939POP3协议中文版
    HDU 1712 01背包 ACboy needs your help
    IOS NSArray 小计
    很有趣的APPLET小程序
    MyEclipse如何显示行数
    e人事管理系统人事档案档案编辑
    2013, VI Samara Regional Intercollegiate Programming Contest
    GB28181视频监控统专题之 相关标准
    基于Golang的http、web服务框架(SSSS)
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14888264.html
Copyright © 2020-2023  润新知