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. 对于单页应用中如何监听 URL 变化的思考

    周末开发了一个在 GitHub 中给 repo 增加自定义备注的 chrome 扩展. 开发这个扩展的原因是我在 GitHub 中所 star 的项目实在太多了(截止目前 671 个),有的项目过个几 ...

  2. Spark学习之数据读取与保存总结(二)

    8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...

  3. JS教程:从0开始

    一. JS简介 1. JavaScript概述 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. ...

  4. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念

    这节比较枯燥,都是原理,不过也有干货.这篇能不能听懂,就决定是否入门...所以,加油吧 博客园/B站/知乎/CSDN  @秋意正寒 转载请在文头注明本文地址 本篇讲空间句法的几个核心概念,有一些也是重 ...

  5. asp.net core系列 56 IS4使用OpenID Connect添加用户认证

    一.概述 在前二篇中讲到了客户端授权的二种方式: GrantTypes.ClientCredentials凭据授权和GrantTypes.ResourceOwnerPassword密码授权,都是OAu ...

  6. React + TypeScript:元素引用的传递

    React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...

  7. 利用Sqoop将MySQL海量测试数据导入HDFS和HBase

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.安装Sqoop 1.下载sqoop,解压.文件夹重命名 wget http://mirror.bit.edu.cn/apache/sqoop/1 ...

  8. sympy科学计算器

    SymPy库常用函数 简介 本文抄于https://www.cnblogs.com/baby123/p/6296629.html SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计 ...

  9. Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为 ...

  10. 图解CSS3-flex布局

    前言 最近笔者在复习以前基础知识,发现很多细的知识点还是需要重新再总结一番.本文对flex布局进行图解说明,以后忘了的同学可以随时过来查看,欢迎转载,烦请注明出处. 主体 万丈高楼平地起,熟悉flex ...