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. ceph osd 自动挂载的N种情况

    直接上干货: ceph自动挂载原理 系统启动后,ceph 通过扫描所有磁盘及分区的 ID_PART_ENTRY_TYPE 与自己main.py中写死的osd ready 标识符来判断磁盘(及其分区)是 ...

  2. 面试题:求第K大元素(topK)?

    一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 ​ 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...

  3. Linux安装任意版本的dotnet环境

    下载地址 https://www.microsoft.com/net/download/dotnet-core/2.1 安装符合服务器CPU架构的二进制包. 如果架构不对,会出现一下错误: -bash ...

  4. 【重学计算机】操作系统D2章:处理器管理

    1. 指令与处理器模式 指令执行周期:取指.译码.执行 指令分类(根据权限) 特权指令:只能被操作系统内核使用(启动IO,置PC值) 非特权指令:所有程序都能使用 处理器模式: 共有四种:0内核模式, ...

  5. DES加解密

    package encrypt; import java.security.Key; import java.security.SecureRandom; import java.util.Base6 ...

  6. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...

  7. 21 , CSS 构造模型

    1. div 2. 边距 3. 边框 4. 定位 5. 浮动 1 21.1  div 部分(division)---<div>元素,经常以 div 形式引用---是 XHTML 元素,用于 ...

  8. Win10系统盘制作及安装流程

    一.下载最新版的 Win10 镜像 1.打开 MSDN 下载 Windows 系统镜像,即 https://msdn.itellyou.cn/ ​ 2.下载的 iso 镜像文件 ​ 3.你可以通过双击 ...

  9. Exp5 Msf基础应用 20164312 马孝涛

    1.本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms11_ ...

  10. Mac 下 Chrome 浏览器 ERR_NETWORK_CHANGED 报错解决方案

    一直以为是 SwitchyOmega 和 SpechtLite 的问题,原来是支付宝安全控件. 由于支付宝现在已经不需要 Mac 安全控件机制,所以可以通过在 terminal 运行以下命令来移除 s ...