博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射(学习整理)----操作类、属性、方法!
阅读量:5955 次
发布时间:2019-06-19

本文共 7314 字,大约阅读时间需要 24 分钟。

   刚学的反射,利用博客写一篇笔记!(附上代码!)

1、下面是我的分析笔记

其他:    1、用static修饰的归位类所拥有的,没有static修饰的归对象拥有!        2、反射机制:    不需要用到new,反射不需要new!    反射是程序运行的时候动态地加载类的属性和方法        获取类对象类型中的内容,都必须通过classType对象    步骤:          1、获取类的对象类型            语法格式:                    Class cls=Class.forName("包名.类名");            举例:                Class
classType=Class.forName("cn.jason.reflections.Constomer"); 说明: 此处的?代表任意类型对象,相当于Object 2、通过反射,获取类对象里面的所有属性 语法格式: Field[] fields=classType.getDeclaredFields(); //循环打印获取到的属性Name for (Field field : fields) { System.out.println(field.getName()); } 3、通过反射,获取类对象里面的所有方法或指定的方法 1)、获取所有的方法 //获取类中的所有的方法 Method[] methods=classType.getMethods(); for (Method method : methods) { System.err.println(method.getName()); } 2)、获取指定方法名称的方法 //属性的第一个字母截取出来,并且大写化 String firstLetter=name.substring(0, 1).toUpperCase(); //拼接属性get方法的方法名 String getMethodName="get"+firstLetter+name.substring(1); String setMethodName="set"+firstLetter+name.substring(1); //现在动态获取get方法 Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{}); //现在动态获取set方法 参数列表:(int id) Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()}); 分析说明一下: (1)getDeclaredMethod(getMethodName, new Class[]{}); 该方法的第一个参数,是需要获取方法对象的方法名, 该方法的第二个参数,是执行方法的参数类别的, 的参数类型的数组 (2)getDeclaredMethod(setMethodName, new Class[]{field.getType()}); 其中的field.getType()是获取类字段的类型 (3反射程序中,关于参数类型的对象数组:用Class[]{}存放 具体的数据类型:用int.class、String.class等形式 提示:Integer.TYPE 效果等价于 int.class 4、通过反射,获取类对象(要执行反射的获取的方法,前提就是要获取类的对象,但不是new出来的,是反射获取得到的!) //通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取) Object obj=classType.getConstructor(new Class[]{
int.class,String.class}) .newInstance(new Object[]{
18,"天使彦"}); 分析一下: 1)、这个方法是使用反射机制获取类的对象的,类似new出来的实例! 2)、其中:getConstructor(new Class[]{
int.class,String.class}) 说明:参数列表放的是:构造方法的参数列表的数据类型、或数据类型的集合 5、执行方法---是否有返回值 根据方法的返回类型来确定 语法格式: 方法对象.invoke(类对象,实参数据集合) 举例: setmethod.invoke(obj,(new Object[]{
18,"天使彦"}); Object value=getmethod.invoke(obj,(new Object[]{}); 说明一下: 实参数据集合:放在Object[]中,毕竟是参数据是可以为各种类型的!

  2、下面是测试源码

实体类: 

1 package cn.jason.reflections; 2  3 /** 4  * 反射测试: 5  *         用户类 6  *    Created by Jason  2016-7-16  上午11:22:03 7  */ 8 public class Constomer { 9 10     /**11      * 成员变量12      */13     private int id;            //用户id14     private String name;    //用户姓名15     16     /**17      *构造器:18      */19     public Constomer(){20         21     }22     public Constomer(int id,String name){23         this.id=id;24         this.name=name;25     }26     27     /**28      * getter和setter方法29      */30     public int getId() {31         return id;32     }33     public void setId(int id) {34         this.id = id;35     }36     public String getName() {37         return name;38     }39     public void setName(String name) {40         this.name = name;41     }42     43     44 }

  反射测试类:

1 package cn.jason.reflections; 2  3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6  7 /** 8  *    Created by Jason  2016-7-16  上午11:31:04 9  */10 public class TestReflect {11     12     public static void main(String[] args) {13         TestReflect.getproperty();14     }15 16     /**17      * 获取用户类型里面的属性以及getter好getter方法18      */19     public static void getproperty(){20          try {21             //第一步:获取对象类型22             Class
classType=Class.forName("cn.jason.reflections.Constomer");23 24 //通过反射,获取用户类里面的所有属性25 Field[] fields=classType.getDeclaredFields();26 27 //循环打印获取到的属性Name28 int i=0;29 for (Field field : fields) {30 String name=field.getName();31 //System.out.println("类对象的字段名称:"+name);32 33 //属性的第一个字母截取出来,并且大写化34 String firstLetter=name.substring(0, 1).toUpperCase();35 36 //拼接属性get方法的方法名37 String getMethodName="get"+firstLetter+name.substring(1);38 String setMethodName="set"+firstLetter+name.substring(1);39 //System.err.println("拼接后的方法名称:"+getMethodName+","+setMethodName);40 41 //现在动态获取get方法42 Method getmethod=classType.getDeclaredMethod(getMethodName, new Class[]{});43 44 //现在动态获取set方法 参数列表:(int id)45 Method setmethod=classType.getDeclaredMethod(setMethodName, new Class[]{field.getType()});46 47 //通过反射来创建对象:等同于Constomer c=new Constomer(001,"Jason"):构造器-----这里的目的是获取类的对象(反射的形式获取)48 Object obj=classType.getConstructor(49 new Class[]{
int.class,String.class}).newInstance(50 new Object[]{
18,"天使彦"});51 //执行get方法获取数据 空参数52 Object value=getmethod.invoke(obj, new Object[]{});53 54 System.out.println("[1]执行了方法"+getMethodName+"()之后,返回结果是:"+value);55 56 //执行set方法:2次遍历的参数类型是不一样的!所以不能写死了!否则会报参数类型错误!57 Object[] params=new Object[1];58 if(i==0){59 params[0]=22;60 }else{61 params[0]="Jason";62 }63 setmethod.invoke(obj, params);64 Object value2=getmethod.invoke(obj, new Object[]{}); 65 System.out.println("[2]执行了方法"+getMethodName+"()之后,返回结果是:"+value2);66 67 //计数器+168 i++;69 }70 71 //获取类中的所有的方法72 Method[] methods=classType.getMethods();73 for (Method method : methods) {74 //System.err.println(method.getName());75 }76 77 } catch (Exception e) {78 e.printStackTrace();79 }80 }81 }

  测试运行结果: 

[1]执行了方法getId()之后,返回结果是:18[2]执行了方法getId()之后,返回结果是:22[1]执行了方法getName()之后,返回结果是:天使彦[2]执行了方法getName()之后,返回结果是:Jason下面是获取反射对象内部全部的方法getName()getId()setName()setId()wait()wait()wait()hashCode()getClass()equals()toString()notify()notifyAll()

 

转载于:https://www.cnblogs.com/newwind/p/5676093.html

你可能感兴趣的文章
Oracle数据库日期格式转换操作
查看>>
Play framework 2.0 -应用程序全局设置(转)
查看>>
如何将div高度填满剩余高度
查看>>
连通图
查看>>
Source insight 添加注释插件
查看>>
centos7下创建mysql5.6多实例
查看>>
go语言net包rpc远程调用的使用
查看>>
redis缓存雪崩,缓存穿透,缓存击穿的解决方法
查看>>
小程序切换账户拉取仓库文件的appid提示
查看>>
润乾报表
查看>>
SQLServer 语句相关
查看>>
Matlab for循环subplot画图加标题
查看>>
音乐播放器
查看>>
CodeForces 722C Destroying Array
查看>>
HTML 图片加载问题
查看>>
HTML
查看>>
Nginx配置详解
查看>>
python常见的数据结构
查看>>
powerDesigner
查看>>
黑马程序员—文件读取路径及行读取的方式,今晚总算有点小懂
查看>>