Class
由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:
 
1).通过Class.forName()静态方法返回Class类的一个实例
Class cls=Class.forName("model.Dog"); Class cls1=Class.forName("model.Person");
2).通过类名.class来获取一个class类的实例
cls =Dog.class;
3).代码运行在非静态区通过this.getClass()获取Class
Class cls= this.getClass();
 
Class对象既然是描述一个类,那么我们通过该Class的实例能够做什么事情呢?
类的属性
获取类名
System.out.println(cls.getName()); System.out.println(cls.getSimpleName());
获取类的修饰限定符
int modi = cls.getModifiers(); System.out.println(modi);
 
--获取一个类的属性
1.根据一个属性名获取一个public属性的描述
Field field = cls.getField("name");
2.获取一个类的全部public属性的描述
Field[] fields = cls.getFields(); System.out.println(fields.length);
 
3.根据一个属性名获取一个在类中声明的属性的描述
Field declaredField = cls.getDeclaredField("gender");
4.获取所有在类中声明的属性的描述
Field[] declaredFields = cls.getDeclaredFields(); System.out.println(declaredField);
 
--获取一个类的方法,通过四个方法获取method对象
1.根据一个方法的名字获取类中的一个public的方法的描述
Method method = cls.getMethod("run", String.class,int.class);
2.获取所有在类中是public的方法的描述
Method[] methods = cls.getMethods();
 
3.根据一个方法名获取在类中声明的一个方法的描述
Method declaredMethod = cls.getDeclaredMethod("eat", null);
4.获取所有在类中声明的方法的描述
Method[] declaredMethods = cls.getDeclaredMethods();
 
 
返回cls所代表的类的实例
Object obj = cls.newInstance(); System.out.println(obj);
 
可以传参
Constructor c = cls.getConstructor(String.class); c.newInstance("aaa");
 
 
 
field
 
获取所有属性
Field[] declaredField =cls.getDeclaredFields(); for (Field filed:declaredField) { System.out.println(filed.getName()); }
使用Filed类的一个实例,来描述cls类的实例中的"一个"属性
Field field =cls.getDeclaredField("gender");
获取属性的名字
System.out.println(field.getName());
获取属性的类型
Class strcls =field.getType(); System.out.println(strcls.getName());
获取属性的限定符
int modifiers =field.getModifiers(); System.out.println(modifiers);
 
创建Dog类的一个对象
Dog d = new Dog("旺财","母"); System.out.println(d.getGender());
暴力设置:设置field的访问
field.setAccessible(true);
 
有d对象,希望给d对象的gender属性赋值,可以使用set方法
field.set(d, "公"); System.out.println(d.name); System.out.println(field.get(d));
 
 
method
通过cls.getDeclaredMethod获取Method对象
Method m=cls.getDeclaredMethod("run",String.class,int .class); Method m=cls.getDeclaredMethod("eat",null);
 
 
获取方法名
System.out.println(m.getName());
 
方法的返回值类型
Class returntype = m.getReturnType(); System.out.println(returntype.getName());
 
方法的参数类型
Class[] paraType = m.getParameterTypes(); for (int i = 0; i < paraType.length; i++) { System.out.println(paraType[i].getName()); }
获取方法的修饰符
int modifiers = m.getModifiers(); System.out.println(modifiers); Dog d = new Dog("旺财", "母");
 
 
方法是可以执行的,使用invoke执行method对象所表示的方法
m.invoke(d, "aaa",123);
m为静态
m.invoke(null,null);
 
 
 
 
/使用反射相关类,为对象p设置name属性的值
Person p=new Person();
//使用反射相关类,为对象p设置name属性的值
Class cls=p.getClass();
Field[] fs=cls.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
if(f.getName().equals("name")) {
String setName = "set"+f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);
//设置器的形参和属性的类型应当一致
Method m = cls.getDeclaredMethod(setName, f.getType());
//相当于p方法调用了setName方法
m.invoke(p, "张山");
}
}
System.out.println(p.getName());
 
 

day07 Class_field_method_反射的更多相关文章

  1. Day07 jdk5.0新特性&Junit&反射

    day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装M ...

  2. python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)

    s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  3. Python面向对象-day07

    写在前面 上课第七天,打卡: 时间的高效利用: 前言: 今天egon老师补充了下 is 和 == 的区别,整理如下:Python中变量的属性以及判断方法 一.面向过程和面向对象 - 1.面向过程 核心 ...

  4. JAVA学习笔记—review基本知识[反射与异常]

    JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...

  5. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  6. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  7. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  8. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  9. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

随机推荐

  1. javascript引擎执行的过程的理解--语法分析和预编译阶段

    一.概述 js是一种非常灵活的语言,理解js引擎的执行过程对于我们学习js是非常有必要的.看了很多这方便文章,大多数是讲的是事件循环(event loop)或者变量提升的等,并没有全面分析其中的过程. ...

  2. 微信小程序之表单验证

    表单验证 何为表单验证呢? 百度百科给出的回答是这样的: 表单验证是javascript中的高级选项之一.JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证 [ ...

  3. k8s使用helm打包chart并上传到腾讯云TencentHub

    本文只涉及Helm的Chart操作,不会对其他知识进行过多描述.至于安装这块,麻烦自行百度吧,一大堆呢. 在容器化的时代,我们很多应用都可以部署在docker,很方便,而再进一步,我们还有工具可以对d ...

  4. 基于ArcGISServer进行分页矢量查询的方案进阶

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    背景 在空间查询中,我们对查询结果要求以分页形式进行展示.G ...

  5. emacs 高亮

    用途:让某个单词高亮显示 1,安装 m-x 回车,输入list-packages 在列表中找到highlight-symbol后,鼠标点击它,再点击安装 2,在.emacs中配置 ;;高亮 (requ ...

  6. JAVA文件的上传与访问

    /** * 各种文件上传与判断 * types 文件类型(1图片 2视频 3文件) */@RequestMapping(method = RequestMethod.POST, path = &quo ...

  7. “Validation failed for one or more entities”异常的解决办法

    日志中出现Entity Framework修改数据库时的错误: Validation failed for one or more entities. See 'EntityValidationErr ...

  8. JVM监控命令

    1.概述Jcmd是一个诊断Jvm的命令集工具, 集成了包括Jps, Jstack以及采集JFR信息等功能. 它必须运行在被诊断Jvm进程的同一台机器上.1)查询JVM进程及PID/dapeng-con ...

  9. redis bind连不上的坑

    由于需要在内网其他服务器上连接redis服务器(192.168.1.110),本想直接在redis配置文件中加上目标的IP地址: bind 192.168.1.166 就可以了,实际上不正确. red ...

  10. 6. VIM 系列 - 全局搜索(ctrlsf.vim)

    目录 全局搜索利器 ag.vim 更强大的全局搜索利器 ctrlsf.vim 全局搜索利器 ag.vim 终端上安装ag: sudo apt install silversearcher-ag vim ...