day27_反射
1、反射-概述(掌握)
反射就是在程序运行过程中,通过.class文件动态的获取类的信息(属性,构造,方法),并调用
2、创建Class文件的三种方式(掌握)
Class.forName("类全名");
          对象名.getClass();
          类名.class
3、获取构造方法并创建对象(掌握)
1、获取Class对象2、通过调用getDeclaredConstructor或者getConstructor 方法创建构造器(Constructor)对象,如果构造方法没有形式参数写nullpublic Constructor getDeclaredConstructor(形式参数1对应的.class对象, 形式参数2对应的.class对象....):该方法可以获取私有构造方法public Constructor getConstructor(形式参数1对应的.class对象, 形式参数2对应的.class对象....):该方法不能获取私有构造方法3、如果获取到的是私有的构造方法的构造器对象,需要调用构造器对象的setAccessible(true)方法4、通过构造器对象的newInstance(实际参数1, 实际参数2)创建对象,如果没有实际参数写null
Class clazz = Class.forName("com.itcast.Person");//必须通过类全名获取
Constructor con = clazz.getDeclaredConstructor(String.class, int.class);//形式参数列表对应的.class列表
con.setAccessible(true);//此处不设置,无法创建该对象,因为构造方法是私有的
Object obj = con.newInstance("zhangsan",120);//调用newInstance(实际参数列表)创建对象
Class clazz = Class.forName("com.itcast.Person");//必须通过类全名获取
Constructor con = clazz.getDeclaredConstructor(null);//因为没有形式参数,所以写null
con.setAccessible(true);//此处不设置,无法创建该对象,因为构造方法是私有的
Object obj = con.newInstance();//因为不需要实际参数,所以调用无参的newInstance方法
4、获取属性并调用(掌握)
一、步骤
Person p1 = new Person();
Person p2= new Person();
Class clazz = Class.forName("Person");//第一步获取Class对象
Field field = clazz.getDeclaredField("name");//第二步通过调用getDeclaredField("属性名")或通过调用getField("属性名") 获取属性操作类
field.setAccessible(true);//第三步如果获取的是私有的属性,调用属性操作类的setAccessible(true)方法
field.set(p1, "张三");//第四步用属性操作类的set(该类的对象,值) 来设置属性值
field.set(p2, "李四");
System.out.println(field.get(p1));//第四步调用属性操作类的get(该类的对象)来获取属性值
System.out.println(field.get(p2));
5、获取成员方法并调用(掌握)
概述:
Person p1 = new Person("张三",13);
Person p2= new Person("李四",14);
Class clazz = Class.forName("Person");
/*
* 调用setName方法
*/
Method setName = clazz.getDeclaredMethod("setName", String.class);
setName.setAccessible(true);//如果getName方法是私有的,此处必须写
setName.invoke(p1, "张三改");
/*
* 调用getName方法
*/
Method getName = clazz.getDeclaredMethod("getName", null); //获取Person类的getName方法对应的方法操作类
getName.setAccessible(true);//如果getName方法是私有的,此处必须写
Object object = getName.invoke(p1, null);//执行p1对象的getName方法,并且将返回值赋值给object
System.out.println(object);
6、反射练习(掌握)
name=jack
Properties p = new Properties();
p.load(new FileReader("config.properties"));
String className = (String)p.get("class");
String name = (String)p.get("nameName");
Class clazz = Class.forName(className);
//创建对象
Constructor constructor = clazz.getConstructor(null);
Object instance = constructor.newInstance();
//通过setName设置name属性
Method setName = clazz.getDeclaredMethod("setName", String.class);
setName.invoke(instance,name );
//通过getName设置name属性
Method method = clazz.getDeclaredMethod("getName",null);
Object object = method.invoke(instance, null);
System.out.println(object);
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(123);
Class clazz = Class.forName("java.util.ArrayList");//必须通过类全名获取
Method method = clazz.getDeclaredMethod("add", Object.class);
method.setAccessible(true);
method.invoke(list, "ss");
for(Object obj: list){
System.out.println(obj);
}
7、今天必须掌握的内容,面试题,笔试题。(掌握这个就可以放心学习后面的知识了)
day27_反射的更多相关文章
- 隐私泄露杀手锏 —— Flash 权限反射
		[简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ... 
- Java学习之反射机制及应用场景
		前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ... 
- 关于 CSS 反射倒影的研究思考
		原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ... 
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
		建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ... 
- 运用Mono.Cecil 反射读取.NET程序集元数据
		CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ... 
- .NET面试题系列[6] - 反射
		反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ... 
- .NET基础拾遗(4)委托、事件、反射与特性
		Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ... 
- C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射
		此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ... 
- [源码]Literacy 快速反射读写对象属性,字段
		Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ... 
随机推荐
- 超酷震撼 HTML5/CSS3动画应用及源码
			HTML5可以制作非常华丽的动画效果,这点通过之前的分享学习我们已经有深刻的了解了,今天我们主要来分享一些HTML5结合CSS3形成的超炫震撼的动画应用以及它们的源代码,真的非常不错. 1.纯CSS3 ... 
- hibernate入门实例
			1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ... 
- BestCoder Round #53 (div.1)
			Problem A: 题目大意: 给出以节点1为根的一棵树A,判断它是否是特殊的.一棵树是特殊的当且仅当不存在和它不完全相同的一棵树B,使得A中点i到点1的距离和B中相等. 题解: 假设一个点x的深度 ... 
- 使用CSDN Code将网站部署到Windows Azure Website上
			在云计算时代,开发和部署应该是完全统一和集成的.在海外,开发者可以用github来管理他们的代码,并且直接部署到Windows Azure上.随着Windows Azure在国内的发布,我们发现,其实 ... 
- hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup                                                       分类:            hdoj             2015-07-18 16:24    139人阅读    评论(0)    收藏
			a typical variant of LCS algo. the key point here is, the dp[][] array contains enough message to de ... 
- <![CDATA[]]>作用
			<![CDATA[]]>的作用是让XML解析器将标签中的字符串当作普通文本对待,以防止某些字符串对XML格式造成破坏. 
- android 加载中、无网络、无数据、出错 四种状态的代码封装
			package com.weavey.loading.lib;import android.content.Context;import android.content.res.TypedArray; ... 
- 使windows隐藏文件全部显示出来
			win+R => cmd=>attrib -s -b *.* /S /D 找出所有隐藏文件夹—— FindHidden 
- STM32中断管理函数
			CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ... 
- MySQL主从复制与读写分离
			MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中, ... 
