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);

  • 相关阅读:
    The last access date is not changed even after reading the file on Windows 7
    渗透基础——获得当前系统已安装的程序列表
    Top 10 Best Free Netflow Analyzers and Collectors for Windows
    平安科技移动开发二队技术周报(第十五期)
    Intent传递对象的几种方式
    SQLite基础学习
    2 Java基础语法(keyword,标识符,凝视,常量,进制转换,变量,数据类型,数据类型转换)
    iOS 之应用性能调优的25个建议和技巧
    Fragment事务管理源代码分析
    CMake
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4565482.html
Copyright © 2011-2022 走看看