Android(java)学习笔记47:通过反射获得构造方法并且使用

摘要:
使用publicConstructor[]getDeclaredConstructors():我们向原始Person类添加一个私有构造,然后使用增强的for循环遍历。然后我们得到以下结果:我们可以遍历所有的构造方法。包括我们刚刚定义的私有结构,它真的很棒吗!!˃ParameterTypes):红色字体表示获取单个构造函数的方法的参数是可变的。不同的参数对应于不同构造函数的对象publicTnewInstance:使用此构造函数对象表示的构造函数创建构造函数声明类的新实例,并使用指定的初始化参数初始化实例。

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循环进行遍历,然后得知如下结果:我们发现只能遍历公共构造方法。

Android(java)学习笔记47:通过反射获得构造方法并且使用第1张

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

Android(java)学习笔记47:通过反射获得构造方法并且使用第2张

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

Android(java)学习笔记47:通过反射获得构造方法并且使用第3张

 

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

免责声明:文章转载自《Android(java)学习笔记47:通过反射获得构造方法并且使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flask_limiter 实践与原理解析Java Servlet 中文API说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WinForm下窗体权限设计

权限设计 笔者不才看了园子里面很多园友写关于权限设计这块内容,那么笔者也在添一笔。这个是笔者在上完软件工程课程后,上交的一篇笔者论文,这里分享给大家交流,当然笔者经验尚浅,若内容有误,请大家指点出来,若大家有什么更好的想法,请提出来共同学习。 一.引言 在软件开发中, 从操作系统到一个仅仅能够发布文章的网站,都要涉及到权限的管理。在Windows 操作...

C++11的for循环,以及范围Range类的实现

C++11支持range-based for循环。这是一个很方便的特性,能省挺多代码。以下代码就能很方便的遍历vector中的元素,并打印出来: 1 2 3 4 5 6 7 8 std::vector<int> int_vec; int_vec.push_back(1); int_vec.push_back(2); //如果要修改i...

java8 的files、path类相关文件遍历API

Path的两种初始化(应该还有别的方式) Path file = new File(path).toPath(); Paths.get 判断是文件、是目录 Files.isRegularFile(file) Files.isDirectory(file) javadoc说,还有既不是文件也不是目录的情况 Files.find 通过属性和路径筛选,可以筛选是...

select2的多选下拉框上传

1.加入multiple: true,属性实现多选下拉框样式 2.下拉框选择后的值是数组类型不要经过数据处理才能进行表单提交 提交的时候原下拉框所在的标签不提交,而是将多选后的值存入页面中的一个隐藏标签中,将这个隐藏标签进行提交   提交时获取选中的下拉框的所有的值,并遍历这些值,将这些值分别以(值 逗号)的形式存入一个变量中,并在遍历完成后去掉最后一个...

To Java程序员:切勿用普通for循环遍历LinkedList

ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: public static void main(String[] args) { List<Integer> arrayList = n...

java alibaba fastJson 遍历数组json

import java.util.*; import com.alibaba.fastjson.*; public class Test { public static void main(String[] args) { //方法1 String json = "[{"companyId":"111111111","com...