反射

java中反射是通过一定的条件得到类对象然后进行各种操作的过程;

反射有可以分为几个层次;

1 得到类对象

2. 得到构造方法

3. 得到属性

4. 得到方法

## 反射(重要)

    重要的关键字的关键字

        Class              //获得类对象,大前提

            Constructor    //获得类中的构造方法,二前提

                Method    //获得类中的方法

                    invoke  //对获得到的方法传参

                Filed      //获得类中的变量

                    set    //对获得到的变量进行设置

    1. 获得类对象  (关键字Class) 

        三种方法


        1)通过包名获取

            Class cls1 = Class.forName("com.reflect.Person");  //括号里面是包名,具体到类,Person是一个类名


        2)通过类名获取

            Class cls2 = Person.Class;


        3) 通过一个构造方法获取

            Class cls3 = new Person(1, "小美").getClass();      //Person(1, "小美")  是Person类的一个有参的构造方法


    2. 获得构造方法(关键字 Constructor)


        先找到类对象:

            Class cls = Class.forName("com.reflect.Person");


        //获得多个构造方法

        1)  获取所有非私有化的构造方法

            Constructor[] constructors = cls.getConstructors();


        2) 获得所有构造方法(包括私有和非私有)

            Constructor allConstructs = cls.getDeclaredConstructors();


        //获得指定构造方法,非私有

        3) Constructor aConstructor = cls.getConstructor(int.class, String,class);  //括号里边是获得构造方法需传入的参数类型

            (1)利用获得到的构造方法创造一个新的对象

                Person p = (Person) aConstructor.newInstance(1, "妹子");

                    p.sleep();

                    p.game();


        获得私有化的构造方法

        4) Constructor privateConstructor = cls.getDeclaredConstructor(null);    //这是一个无参的构造方法

            (1) 用得到的构造方法创造对象,需要授权

                privateConstructor.setAccessible(true);

                Person p2 = (Person) privateConstructor.newInstance(null);

                p2.setId(3);

                p2.setName("小媚");


    3. 获得成员方法(关键字 Method)

        首先创建类对象

            Class cls = Class.forName("com.reflect.Person");


        获得所有方法:


        1) 获得所有方法(非私有,同时会获取到父类的方法)

            Method[] allMethod = cls.getMethods();


        2) 暴力方式获得所有方法(包括私有和非私有,会过滤掉父类的方法)

            Method[] allMethods = cls.getDeclareMethods();


        获得指定方法:

            Person aPerson = (Person) cls.getConstructor(int.class, String.class).newInstance(1, "小花");


        3) 获取一个指定的普通公共方法:

            Method aMethod = cls.getMethod("test", int.class);          //  "test" 是指定方法的方法名, int.class 是使用方法需传入参数的类型

            aMethod.invoke(aPerson, 6);                //对参数进行设置


        4) 获取一个静态的方法

            Method aStaticMethod = cls.getMethod("ear", null);          //  null代表此方法不需要传入任何参数

            aStaticMethod.invoke(null, null);                      // 因为没有任何参数,所有不需要设置值


        5) 用暴力方法获取一个私有化方法

            Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);        //私有化不需要传入参数所以是null

            aPrivateMethod.getAccessible(true);                    //给方法授权

            aPrivateMethod.invoke(aPerson, null);              //给私有化设置值


    4. 获得成员变量

        首先创建类对象

            Class cls = Class.forName("com.reflect.Person");


        获得所有变量:

        1) 获得所有变量(非私有)

            Field[] aField = cls.getFields();


        2) 暴力方法,获得所有变量(包括私有和非私有)

            File[] aFileds = cls.getDeclaredFields();


        3) 获得指定变量(非私有)

            Field aPublicField = cls.getField("test");          //括号内是指定变量的变量名


            aPublicField.set(aPerson, 5);                  //对获得到的变量赋值

            System.out.println(aPerson.test);              //变量的使用方法


        4) 暴力方法,获得私有化变量

            Field aPrivateField = cls.getDeclaredfField("id");     

            aPrivateField.setAccessible(true);          //对变量重新赋值之前需要对变量授权

            aPrivateField.set(aPerson, 8);              //对变量赋值

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 学习Android的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群...
    kingZXY2009阅读 333评论 0 0
  • 前言,本来只是想研究一下注解的,不过发现,要懂注解先得懂反射,别问我为什么,你可以自己试试 JAVA反射 主要是指...
    justCode_阅读 1,224评论 2 9
  • 获取反射类的三种方法: 1. Class.forName("类所在的包和类名"); Class class1 = ...
    YaphetS081阅读 350评论 0 0
  • Java反射机制 前言 网页版的jdk的API离线版API 什么是反射机制 反射是java语言的一个特性,它允程序...
    爱撒谎的男孩阅读 352评论 0 3
  • 当我们做错事情的时候不应该去埋怨别人或是给自己找一些借口,首先我们要从自身找原因,改变不了她人,可以改变自己!
    Ding欣欣阅读 202评论 0 2