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设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
随机推荐
- React Native & app demos
React Native & app demos https://github.com/ReactNativeNews/React-Native-Apps https://github.com ...
- parcel+vue入门
一.parcel简单使用 npm install -D parcel-bundler npm init -y (-y表示yes,跳过项目初始化提问阶段,直接生成package.json 文件.) Pa ...
- BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- 相似度度量:欧氏距离与余弦相似度(Similarity Measurement Euclidean Distance Cosine Similarity)
在<机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)>一文中,我们通过计算文本特征向量之间 ...
- bzoj 3669: [Noi2014]魔法森林 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec ...
- nowcoder300J Mex
题目链接 题意 给出一个长度为\(n(n \le 10^5)\)序列,求其每个子序列之和所组成的集合的\(mex\) 思路 这么水的题都没想出来,感觉自己脑子瓦特了. 假设前\(i\)位可以组成区间\ ...
- Educational Codeforces Round 63 (Rated for Div. 2)
传送门 A. Reverse a Substring 题意: 给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s: 如果能,输出 "YES",并 ...
- (二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- python通过套接字来发送接收消息
案例如下: 1.启动一个服务端套接字服务 2.启动一个客户端套接字服务 3.客户端向服务端发送一个hello,服务端则回复一个word,并打印 参考地址:https://www.cnblogs.com ...
- Gcc 命令大全
gcc这条命令用来将源代码生成可执行程序,下面来看一下gcc的常用选项. 1.无选项编译链接 例:命令:gcc test.c //会默认生成a.out可执行程序 2.-E: 进行预处理和编译,生成汇编 ...