反射精讲(框架程序员的必经之路)

反射的概念:

 小博的个人理解就是在你不知道某个类的构造方法、成员变量、成员方法时候,(嗯哼~),你就可以采取反射的方式来对它进行自己的操作。

 Student类:

 1 package Reflect;
 2
 3 import java.util.Date;
 4
 5 public class Student {
 6     private String name;
 7     private int age;
 8     private Date date;
 9
10     public Student(){
11         System.out.println("This is a null 构造");
12     }
13     public Student(String name){
14         this.name =name;
15     }
16     //私有的构造
17     private Student(Date date){
18         this.date =date;
19     }
20     public Student(String name,int age){
21         this.name =name;
22         this.age =age;
23     }
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30     public int getAge() {
31         return age;
32     }
33     public void setAge(int age) {
34         this.age = age;
35     }
36     public Date getData() {
37         return date;
38     }
39     public void setData(Date date) {
40         this.date = date;
41     }
42
43 }

  

 针对于构造方法:

 1 package Reflect;
 2
 3 import java.lang.reflect.Constructor;
 4 import java.util.Date;
 5
 6 import org.junit.Test;
 7
 8 public class ReflectDemo {
 9     //获取构造方法 一共三种方式(框架程序员使用)
10     /*@Test
11     public void test1() throws Exception, Exception{
12         Class clazz  =  Student.class;
13         Constructor c = clazz.getConstructor(null);
14         Student s = (Student)c.newInstance(null);
15         System.out.println(s);
16
17     }*/
18     /*@Test
19     public void test1() throws Exception, Exception{
20         Class clazz  =  Student.class;
21         Object object = clazz.newInstance();
22         System.out.println(object.getClass().getName());
23
24     }*/
25     @Test
26     public void test1() throws Exception, Exception{
27         Class c =Class.forName("Reflect.Student");
28         Student s =(Student) c.newInstance();
29         System.out.println(s);
30
31     }
32     //获取有参数构造
33     @Test
34     public void test2() throws Exception, Exception{
35     Class clazz =Student.class;
36     //获取构造函数
37     Constructor c = clazz.getConstructor(String.class);
38     Student s =(Student)c.newInstance("赵日天");
39     System.out.println(s.getName());
40     }
41     //获取私有的构造方法
42     @Test
43     public void test3() throws Exception, Exception{
44         Class clazz =Student.class;
45         Constructor an = clazz.getDeclaredConstructor(Date.class);
46         //暴力反射
47         an.setAccessible(true);
48         Student s =(Student)an.newInstance(new Date());
49         System.out.println(s.getData());
50
51     }
52 }

RefelctDemo

 字段和成员方法:

 1 package Reflect;
 2
 3 public class Person {
 4     //普通成员变量
 5     public String name;
 6     //私有的
 7     private int age;
 8     //静态的
 9     public static String address;
10
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17
18     //创建一个普通的成员方法
19     public void m1(){
20         System.out.println("无参数无返回值的方法");
21     }
22     //创建一个有参数的成员方法
23     public void m2(String name){
24         System.out.println("有参数"+name);
25     }
26     //创建一个静态的方法
27     public static void m3(String name){
28         System.out.println("静态");
29     }
30     //私有的
31     private static void m4(){
32         System.out.println("私有");
33     }
34 }

Person

  1 package Reflect;
  2
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5
  6 import org.junit.Test;
  7
  8 public class Reflect02Demo {
  9     //反射测试字段
 10     @Test
 11     public void test05() throws Exception, Exception{
 12         //获取字节码文件
 13         Class clazz = Person.class;
 14         //获取字段函数
 15         Field field = clazz.getField("name");
 16         Person p  =(Person)clazz.newInstance();
 17         //读取字段值
 18         String s =(String)field.get(p);
 19         //输出
 20         System.out.println(s);
 21         //设置值
 22         field.set(p,"杨先生");
 23         System.out.println(p.name);
 24     }
 25     //私有的字段
 26     @Test
 27     public void test06() throws Exception, Exception{
 28         //获取字节码文件
 29         Class clazz = Person.class;
 30         //获取字段函数
 31         Field field = clazz.getDeclaredField("age");
 32         //暴力反射
 33         field.setAccessible(true);
 34         Person p  =(Person)clazz.newInstance();
 35         //读取字段值
 36         int i =(Integer)field.get(p);
 37         //输出
 38         System.out.println(i);
 39         //设置值
 40         field.set(p,22);
 41         System.out.println(p.getAge());
 42     }
 43     //静态字段
 44     @Test
 45     public void test07() throws Exception, Exception{
 46         //获取字节码文件
 47         Class clazz = Person.class;
 48         //获取字段函数
 49         Field field = clazz.getField("address");
 50         //读取字段值
 51         String s =(String)field.get(null);
 52         //输出
 53         System.out.println(s);
 54         //设置值
 55         field.set(null,"山东");
 56         System.out.println(Person.address);
 57     }
 58
 59
 60     //测试反射获取普通的方法
 61     @Test
 62     public void test01() throws Exception, Exception{
 63         //获取字节码文件
 64         Class clazz = Person.class;
 65         //获取构造函数,null表示该参数用到的类型为空
 66         Method method = clazz.getDeclaredMethod("m1", null);
 67         //调用方法,null表示无参数
 68         method.invoke(clazz.newInstance(), null);
 69     }
 70     //测试反射获取有参数方法
 71     @Test
 72     public void test02() throws Exception, Exception{
 73         //获取字节码文件
 74         Class clazz = Person.class;
 75         //获取构造函数,null表示该参数用到的类型为空
 76         Method method = clazz.getDeclaredMethod("m2", String.class);
 77         //调用方法,null表示无参数
 78         method.invoke(clazz.newInstance(), "黎明");
 79     }
 80     //测试反射获取静态方法
 81         @Test
 82         public void test03() throws Exception, Exception{
 83             //获取字节码文件
 84             Class clazz = Person.class;
 85             //获取构造函数,null表示该参数用到的类型为空
 86             Method method = clazz.getDeclaredMethod("m3", String.class);
 87             //调用方法,null表示无参数
 88             method.invoke(null,"大白");
 89         }
 90         //测试反射获取静态私有方法
 91         @Test
 92         public void test04() throws Exception, Exception{
 93             //获取字节码文件
 94             Class clazz = Person.class;
 95             //获取构造函数,null表示该参数用到的类型为空
 96             Method method = clazz.getDeclaredMethod("m4",null);
 97             //暴力反射
 98             method.setAccessible(true);
 99             //调用方法,null表示无参数
100             method.invoke(null,null);
101         }
102
103 }

Reflect02Demo

额外的注意事项,关于参数是数组类型:

  

时间: 2024-11-08 21:04:33

反射精讲(框架程序员的必经之路)的相关文章

直通BAT算法精讲附程序源码

课程内容第1章 免费试看2 视频 | 2 练习字符串和二叉树问题免费试看1.1 二叉树打印 免费1.2 二叉树打印练习题 免费1.3 字符串 免费1.4 两串旋转练习题 免费 第2章 排序4 视频 | 16 练习详细介绍常见的排序算法过程,以及各个排序算法稳定性.时间和空间复杂度,当然还有常见面试题目的讲解.2.1 排序(1)2.2 冒泡排序练习题2.3 选择排序练习题2.4 插入排序练习题2.5 归并排序练习题2.6 快速排序练习题2.7 堆排序练习题 免费2.8 希尔排序练习题2.9 排序(

怎样为程序员做职业规划

真正的智慧是拥有对人心的判断力.记得<论语>中也讲过:真正的智慧就是知人,用正直的力量影响周围,影响社会.这种智慧会使我们能够深深地沉静下来,面对每一位程序员以及其背后经历过的历史,能够顺着他心灵上每一条纹路,走进他深处.隐秘.那些欢喜忧伤,那些心灵的愿望,那些对美好生活的设计之路. 经过半年时间的锻炼,大熊和小蔡彼此在技术与素养能力上都提高很快.老板又委任大熊新的重任,承担一个规模更大的项目.由于公司整体管理混乱,其他几个项目组中的程序员辞职现象时有发生,公司整体项目风险加大,经常是拆东墙补

.Net程序员玩转Android系列之二~Android Framework概要(1)

从windows操作系统说起 人们总是喜欢从将陌生的事物和自己所了解的东西关联起来,以加深对未知事物的了解,这一讲我们从windows操作系统说起,逐步引领带大家走入android的世界.写任何程序都需要知道程序运行的原理和环境,就比如开发winform程序,你至少需要知道操作系统的原理,CLR运行时,了解一些常用的C/C++库.诚然,你不需要全部了解得很清楚也能写出很不错的应用程序,但是你了解的越清楚,钻研得越透彻,那么你越能开发出适合于你所在平台的.更优化的应用程序.譬如在windows操作

从草根到百万年薪程序员的二十年风雨之路

1.不快乐的中学时期 我1976年出生于湖南省衡阳市常宁县的农村,没山没水没肉吃,童年时期是很开心的,放牛.捉鱼,偷西瓜,农村小孩子玩过的我都玩过. 初中是乡里的中学,毕业后考入了县的重点高中,高中三年,可能是学习方法和兴趣的原因,成绩一般,1996年参加高考,468分,最低录取线520分,大部分的同学选择了复读,后来基本上考上了大学. 中学期间,我真的不喜欢读书,说是逼着自己学习一点也不过份,特别是写作文,非常痛苦,高考后再也不用考试和写作文,反而解脱了. 2.从五笔打字到Foxpro 我父母

真正程序员的六点不同

今天看到一篇文章,讲了程序员也是新时代的手艺人,理想的程序员才是合格的手艺人,而他们比大多数平庸的程序员在六个方面做的好一点点,就是这些一点点积累让他们与众不同.下面装载这篇完整的文章. 我算是靠坑蒙拐骗进了程序员的门,然后一路狂奔.26岁之前几乎没有任何写代码的经验,研究生毕业却意外选择了一家不可能提供培训的初创公司,在每日担忧公司倒闭.害怕被炒鱿鱼以及同事冷落白眼的三重压力下逆流而上,一年半后离职,已是拥有 500万用户产品的后台主程.从前我对计算机技术心怀畏惧,认定技术高人一定有佛光笼罩,

【转】是不是程序员总会遇到一个瓶颈期,觉得自己没有进步了,该怎么解决?

一 程序员的困惑 第一个跟我说这个的是小丁丁. 小丁丁在论坛时代的修真院,就已经是比较出名的了,他的学号是016. 在线上自学的时候会用Flex布局,还会做Gif动画. 当他说要来线下学习的时候,算是我第一个比较期待的人. 是的,那个时候我每天都会看他们的日报. 后来小丁丁成了修真院的睡袋师兄,几乎所有的线下师弟,在修真院打地铺的时候,都会找小丁丁买睡袋. 他也确实成长的很快,很快就可以独立完成一个项目了. 这很不容易,特别是在修真院的教学体系还不完善的时候.然后我把呆萌奎和小丁丁都留了下来,他

(转载)程序员该如何定位?看这四大方向

宽泛的意义上讲,程序员是这样一群人:他们用某种语言或技术,开发某种软件产品(系统),解决特定现实领域的问题. 有了这个定义,我们就可以来讨论程序员的几种常见定位: 解决某类问题的专业人士 软件架构与设计 技术专家 技术传播与布道 解决问题的人 我到底能够解决什么问题?给别人带来什么样的方便? 这是每个程序员首先要考虑的问题.这决定了你要在什么样的领域.什么样的公司工作,决定了你做什么产品,也决定了你要选择什么技术. 比如你想提升远程办公的效率,那可能就会去做与协同办公.沟通.项目管理等相关的产品

程序员难以逃避的几个坎儿及解决方法

程序员难以逃避的几个坎儿及解决方法 俗话说人在江湖,身不由己,程序员的江湖更是如此. 转眼间,我已在程序江湖里混迹了10年有余,也于今天:农历年2014年10月10日迎来了我的第三十五个生日.可以说这是一部非常丰富多彩程序人生.物以类聚,人以群分,在程序员的江湖混迹的时间久了,身边几乎都是程序员,耳濡目染的也都是各种苦逼程序员的种种经历和段子,很多段子,看似可笑,但对程序员确是真实的写照.菜鸟.屌丝.油条.大虾大拿等等,这些社会流行语,无不是起源于程序江湖,然后被发展光大.这些写照的背后,其实映

程序员的营销探讨

引子 文章开篇就从经典的和尚卖梳子说起吧.链接参考:https://m.imooc.com/article/259628销售员甲看到和尚晒太阳挠头皮时,灵机一动卖出一把.销售员乙建议拜佛上香要心诚,蓬头垢面是对佛的不敬,应在每座庙佛像的香案前放把梳子供善男信女梳理鬓发.主持采取了他的建议,买了十把.销售员采取梳子上刻"积善梳",作为赠品回馈虔诚的香客,卖出1000把.故事简介到此为止.这三个销售员都属于挖掘需求.有的属于挖掘客户自己的需求,有的属于挖掘客户的客户需求. 程序员如何挖掘需