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. 查看keras自动给文件夹标号

    from tensorflow.contrib.keras.api.keras.preprocessing.image import ImageDataGenerator,img_to_array f ...

  2. python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决

    在学习python语言中用json库解析网络数据时,我遇到了两个编译错误:json.decoder.JSONDecodeError: Expecting property name enclosed ...

  3. 彻底理解浏览器的缓存机制(http缓存机制)

    一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...

  4. mysql数据库NO CONNECTION问题分析以及解决方案

    自己的站点有时候会挂掉,着实比较麻烦,我不会24小时都看着,说多的都是泪 出现mysql出现NO CONNECTION 有可能原因:mysql服务出现问题 解决方案:重启mysql服务,数据库就连接上 ...

  5. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  6. Element-ui使用技巧

    使用第三方字体包 把下载后的*.zip字体包放到项目中在main.js中引用. import "@/assets/font/iconfont.css"; 注意一定要放到elemen ...

  7. .NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比

    对比 WinCE Android 行业场景 扫描分拣.车载.工控 扫描分拣.车载定位 开发语言 C++.C# Java/.NET(Smobiler) 开发环境 Visual Studio Androi ...

  8. python assert的用处

    python assert 句语格式及用法很简单.通常程序在运行完之后抛出异常,使用assert可以在出现有异常的代码处直接终止运行. 而不用等到程序执行完毕之后抛出异常. python assert ...

  9. 浅谈CSS3 box-sizing 属性 有趣的盒模型

    盒模型的组成大家肯定都懂,由里向外content,padding,border,margin. 盒模型是有两种标准的,一个是标准模型,一个是IE模型. 从上面两图不难看出在标准模型中,盒模型的宽高只是 ...

  10. 一个非常简单的IMPDP事儿

    EXPDP出来的DMP文件包含2个Schema的表,现在要IMPDP到一个Schema里面试了几把都报错,好久不用逻辑导出入,折腾了好久,出现各种错误1.创建目录并授权create or replac ...