Java的反射机制(3)_开始使用反射机制(笔记)2019/8/2

Idea提示我newInstance();被弃用了,

我查了下,使用getDeclaredConstructor().newInstance(); 代替

1)通过反射创建实例:

newInstance(); 会在创建实例对象时调用无参数构造器,

(所以想要使用反射机制,要求类必须有无参数构造器,并且必须是public修饰的):

证明newInstance(); 调用了无参数构造器,比如Student类的构造器这么写:


     程序里这么写:

                 Class clazz = Student.class;

               Object obj = clazz.getDeclaredConstructor().newInstance();

                printf(obj);

输出实例:


2)通过反射获取类完整的结构(父类、注解、实现的接口、方法、异常、内部类、属性等等):

这里为了测试的进行:

    Student继承 Per类(只有一个public long id属性),实现了MyInterface1, MyInterface2这两个接口(都是空接口),还贴了一个注解@Data


//1)getFields(); 获取当前类及其父类声明为public的属性

 Class clazz = Student.class;

    Field[] fields = clazz.getFields();

  for(Field filed : fields){

            printf(filed);

}

结果:


etFields()

//2)getDeclaredFields(); 获得当前类的所有属性

Field[] fields1 = clazz.getDeclaredFields();

            for(Field filed : fields1){

            printf(filed);

}

结果:


getDeclaredFields()

//3)//权限修饰符 变量类型 变量名

//获取属性各个部分的内容(getDeclaredFields ()只能获取这个类本身声明的属性)

Class clazz = Student.class;

Field[] fields = clazz.getDeclaredFields();

        for(Field filed : fields) {          //1 获取每个属性的成员修权限饰符号

            int i =filed.getModifiers();//1 public 2 private 4 protected 8 static .........

            printf(i);

                //修饰符                         //获取数据类型             //输出变量名

printf(Modifier.toString(i)+" "+filed.getType()+" "+filed.getName());//转换为对应的名称

}

//2 获取每个属性的变量类型 //3 获取属性名}

结果如下:(public 对应1 ,private对应2,其他的修饰符对应的号码可以查看源代码)


//4)  获取所有方法使用lazz.getDeclaredMethods();和clazz.getMethods(); 两者的区别于属性的相同

一个获取运行时类和父类的所有public属性,一个获取运行时类自身声明的任何属性:

//5)获得所有构造器

Class clazz = Student.class;

Constructor[] constructors = clazz.getDeclaredConstructors();

for(Constructor   constructor  :  constructors){ 

        printf(constructor);

}

//6)其他:


获取父类:

    //获取父类

            Class clazz = Student.class;

            Class supperClass = clazz.getSuperclass();

            printf(supperClass);

//获取带泛型的父类

             Class clazz = Student.class;

            Type supperType = clazz.getGenericSuperclass();

            printf(supperType);

获取实现的接口:

Class clazz = Student.class;

Class[] inter = clazz.getInterfaces();

for(Class i : inter){

        printf(i);

}

获取类的注解:(如果注解的生命周期太短会在运行前就被丢掉了,就得不到)

Class clazz = Student.class;

Annotation[] annotations = clazz.getAnnotations();

for( Annotation   annotation   :  annotations){

            printf(annotation);

}

3:通过反射运行指定的方法,得到指定的属性:

public 属性:

        Class clazz = Student.class;

        //1)获取指定属性

        Field name = clazz.getField("name");

        Student student = (Student)clazz.getDeclaredConstructor().newInstance();

        name.set(student, "王麻子");

        printf(student);

private属性:

        Class clazz = Student.class;

        //1)获取指定属性

        Field age = clazz.getDeclaredField("age");

        age.setAccessible(true); //设置为可访问的

        //3)赋值运行时类指定属性 (name属性)

        age.set(student, 1000);

        printf(student);


先设置了name,在设置了age

public方法: clazz.getMethod("toString",Class.......);如果方法带有参数,需要加上

        Class clazz = Student.class;

         Method toString  = clazz.getMethod("toString"); //得到方法

        Student student =(Student) clazz.getDeclaredConstructor().newInstance();//创建实例

        String str = (String)toString.invoke(student); //方法调用

        printf(str);

private方法:这里就带了参数 getDeclaredMethod()

        Method display = clazz.getDeclaredMethod("display", String.class, String.class, String.class);

        display.setAccessible(true); //设置可访问权限

        display.invoke(student, "1","2","3");


对应的方法


输出


static方法:(static一般不会设置 private 权限吧?所以一般使用 getMethod("sut"); )

            //静态方法

            Method sut = clazz.getMethod("sut");

            sut.invoke(Student.class);  //这里传入的是Class 而不是实例

调用指定构造器:

        Class clazz = Student.class;

        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        Student student = (Student) constructor.newInstance("张三");

        //等价于  Student student = clazz.getDeclaredConstructor(String.class).newInstance("张三");

        printf(student);

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

推荐阅读更多精彩内容