java 日常学习记录-反射
Hero类
package helloworld;
public class Hero {
public String name; //姓名
public float hp; //血量
public float armor; //护甲
public int moveSpeed; //移动速度
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
}
目的:读取Hero类属性 赋值,2:读取所有字段打印出类型和名称,3:调用方法
package helloworld; import java.lang.reflect.Field;
import java.lang.reflect.Method; //通过反射修改属性的值 测试类 Hero
//获取所有属性名称和类型
//调用方法 /*
* //getField和getDeclaredField的区别
* //getField 只能获取public的,包括从父类继承来的字段。
* //getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。
* */
public class TestReflection {
public static void main(String[] argStrings) {
//传统方式
Hero hero=new Hero();
hero.name="测试"; try {
//获取属性并设置值
Field field = hero.getClass().getDeclaredField("name");
//修改这个字段的值
field.set(hero, "我是java学习的");
//打印
System.out.println(hero.name); //扩展获取所有字段
Field[] fields = hero.getClass().getDeclaredFields();
for(int i=;i<fields.length; i++) {
Field tempField = fields[i];
//属性类型
String typeNameString=tempField.getGenericType().toString();
String name = tempField.getName();
System.out.println("字段名称:"+name+" 类型:"+typeNameString);
} //调用方法
Method m=hero.getClass().getMethod("setName", String.class);
m.invoke(hero, "第一个参数是具体调用的对象 第2个参数是赋值");
// 使用传统的方式,调用getName方法
System.out.println(hero.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
例子2:通过配置文件获取对象当配置文件里的内容发生变化的时候,就会得到不同的对象。
源代码不需要发生任何变化,只需要修改配置文件,就可以导致程序的逻辑发生变化, 这是一种基于配置的编程思想。
spring 中的IOC和DI的底层就是基于这样的机制实现的(类似的Ling to Sql 也是通过类似的注解(类似net的类 字段上面加上特性) 加上反射 实现)
新建hero.config文件 内容:helloworld.APHero
package helloworld; import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Constructor;
//需求:1:新建 hero.config 内容:helloworld.Hero
//2:通过反射读取hero.config 文件 取出其中的类名,根据类名实例化出对象
/*补充
* 与传统的通过new 来获取对象的方式不同
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象
Spring框架中的IOC和DI的底层就是基于这样的机制实现的。
获取类对象有3种方式
1. Class.forName
2. xxxx.class
3. new xxxx().getClass()
*/
public class test { public static void main(String[] args) {
Hero h = GetHero();
System.out.println(h);
} public static Hero GetHero() {
try {
//读取文件,测试学习不做异常(如 文件不存在)判断
File f = new File("G:\\projectJava\\hero.config");
FileReader fr = new FileReader(f);
char[] all = new char[(int) f.length()];
fr.read(all);
fr.close();
String className = String.valueOf(all);
//反射
//得到类名
className=new String(all).replaceAll("\\s*", ""); //helloworld.APHero helloworld.APHero
//类对象
Class<?> cs=Class.forName(className);
//构造器
Constructor<?> c=cs.getConstructor();
//通过构造器实例化
Hero h= (Hero) c.newInstance();
return h;
} catch (Exception e) {
return null;
}
}
}
java 日常学习记录-反射的更多相关文章
- java 日常学习记录
前言:记录自己初学java 遇到的问题. 环境(win10 开始安装的IDEA,net 开发者 )学习网址:http://how2j.cn/stage/14.html (不是打广告) 特别是对初学 ...
- Java设计模式学习记录-迭代器模式
前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- Java设计模式学习记录-外观模式
前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...
- Java 8 学习记录
Java 8 学习记录 官方文档 https://docs.oracle.com/javase/8/ https://docs.oracle.com/javase/8/docs/index.html ...
- Java设计模式学习记录-模板方法模式
前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- Java设计模式学习记录-观察者模式
前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
随机推荐
- 分布式存储ceph——(3)ceph常用命令
1.查看ceph集群配置信息 1 ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show 2.在部署节点修改了ceph ...
- 2016湖南省赛 [Cloned]
A.2016 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 组数 ...
- 【学亮编程手记】Spring Cloud三大组件Eureka/Feign/Histrix的原理及使用
- 使用pycharm进行远程开发部署调试设置 与 远程部署调试是否必须使用远程主机的解释器?
远程开发部署调试目的: 配置pycharm远程部署调试主要用于本地代码与远程服务器上的代码进行同步,使得本地代码经过修改后,可以很容易的同步到远程服务器上.同时设置pycharm的解释器为远程服务器的 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- winform项目导入数据
一.点击导入按钮,弹出文件选择框 这个方法的使用要引用下面两个命名空间: using System.Windows.Forms;using DevExpress.XtraEditors; privat ...
- 2019年6月pmp考试马上开始!报考9月怎么进行中文报名?
2019年6月pmp考试马上开始了,现在还可不可以报名参加考试呢?来不来得及呢?怎么进行中文报名,考点在哪里?如果现在想报考9月怎么进行中文报名?下面慧翔天地就给大家分享! (关于甘特图的画法,项目管 ...
- 阿里云Redis开发规范
转自: https://yq.aliyun.com/articles/531067 摘要: 本文介绍了在使用阿里云Redis的开发规范,从键值设计.命令使用.客户端使用.相关工具等方面进行说明,通过本 ...
- python 速记正则使用(转)
目录 python 速记正则使用(转) 正则表达式语法 字符与字符类 量词 组与捕获 断言与标记 条件匹配 正则表达式的标志 Python正则表达式模块 四大功能 两种方法 常用方法 匹配对象的属性与 ...
- [面试]volatile类型修饰符/内存屏障/处理器缓存
volatile类型修饰符 本篇文章的目的是为了自己梳理面试知识点, 在这里做一下笔记. 绝大部分内容是基于这些文章的内容进行了copy+整理: 1. http://www.infoq.com/cn/ ...