zoukankan      html  css  js  c++  java
  • Android(java)学习笔记47:通过反射获得构造方法并且使用

    1. 获取字节码文件对象:

                Class c = Class.forName("cn.itcast_01.Person");

    2. 获取构造方法

                     public Constructor[] getConstructors():所有公共(public)构造方法

                     public Constructor[] getDeclaredConstructors():所有构造方法

    比如使用:Constructor[] cons = c.getDeclaredConstructors();//获取所有构造方法

    下面我会通过代码形式进行讲解:

    Person.java:

     1 package cn.itcast_01;
     2 
     3 public class Person {
     4     private String name;
     5     int age;
     6     public String address;
     7 
     8     public Person() {
     9     }
    10 
    11     private Person(String name) {
    12         this.name = name;
    13     }
    14 
    15     Person(String name, int age) {
    16         this.name = name;
    17         this.age = age;
    18     }
    19 
    20     public Person(String name, int age, String address) {
    21         this.name = name;
    22         this.age = age;
    23         this.address = address;
    24     }
    25 
    26     public void show() {
    27         System.out.println("show");
    28     }
    29 
    30     public void method(String s) {
    31         System.out.println("method " + s);
    32     }
    33 
    34     public String getString(String s, int i) {
    35         return s + "---" + i;
    36     }
    37 
    38     private void function() {
    39         System.out.println("function");
    40     }
    41 
    42     @Override
    43     public String toString() {
    44         return "Person [name=" + name + ", age=" + age + ", address=" + address
    45                 + "]";
    46     }
    47 
    48 }

    ReflectDemo.java:

     1 package cn.itcast_02;
     2 
     3 import java.lang.reflect.Constructor;
     4 
     5 import cn.itcast_01.Person;
     6 
     7 /*
     8  * 通过反射获取构造方法并使用。
     9  */
    10 public class ReflectDemo {
    11     public static void main(String[] args) throws Exception {
    12         // 获取字节码文件对象
    13         Class c = Class.forName("cn.itcast_01.Person");//这里红色字体的是配置文件,将来我们只要改一下配置文件,就加载另一个类构造,方便
    14 
    15         // 获取构造方法
    16         // public Constructor[] getConstructors():所有公共(public)构造方法
    17         // public Constructor[] getDeclaredConstructors():所有构造方法
    18         // Constructor[] cons = c.getDeclaredConstructors();
    19         // for (Constructor con : cons) {
    20         // System.out.println(con);
    21         // }
    22 
    23         // 获取单个构造方法
    24         // public Constructor<T> getConstructor(Class<?>... parameterTypes)
    25         // 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
    26         Constructor con = c.getConstructor();// 返回的是构造方法对象
    27 
    28         // Person p = new Person();
    29         // System.out.println(p);
    30         // public T newInstance(Object... initargs)
    31         // 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
    32         Object obj = con.newInstance();
    33         System.out.println(obj);
    34         
    35         // Person p = (Person)obj;
    36         // p.show();
    37     }
    38 }

    (1)使用public Constructor[] getConstructors(),然后利用增强for循环进行遍历,然后得知如下结果:我们发现只能遍历公共构造方法。

    (2)使用public Constructor[] getDeclaredConstructors():然后利用增强for循环进行遍历,然后得知如下结果:我们发现可以遍历所有构造方法

    (3)使用public Constructor[] getDeclaredConstructors():我们在原来的Person类中添加一个private构造,然后利用增强for循环进行遍历,然后得知如下结果:我们发现可以遍历所有构造方法。包括刚刚我们定义的private的构造,是不是感觉很牛逼!!!

     

     3.获得单个构造方法:

                            public Constructor<T> getConstructor(Class<?>... parameterTypes) :红色字体表明这个获取单个构造函数的方法的参数是可变的。不同的参数 对应于 不同构造函数的对象

                            public T newInstance(Object... initargs):使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。这里返回类型为T,默认为Object类型

    使用实例:

                Class c = Class.forName("cn.itcast_01.Person");//获取字节码文件Person.class的对象

                Constructor con = c.getConstructor();// 返回的是构造器对象,空构造器对象

                Object obj = con.newInstance();//通过空构造器对象 去创建 Person类的 实例obj

                System.out.println(obj);

    等价于:

                 Person  p = new Person();

                 System.out.println(p);

  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4565482.html
Copyright © 2011-2022 走看看