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 日常学习记录-反射的更多相关文章

  1. java 日常学习记录

    前言:记录自己初学java 遇到的问题. 环境(win10  开始安装的IDEA,net 开发者  )学习网址:http://how2j.cn/stage/14.html (不是打广告) 特别是对初学 ...

  2. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  3. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  4. Java设计模式学习记录-外观模式

    前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...

  5. Java 8 学习记录

    Java 8 学习记录 官方文档 https://docs.oracle.com/javase/8/ https://docs.oracle.com/javase/8/docs/index.html ...

  6. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  7. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  8. Java设计模式学习记录-观察者模式

    前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...

  9. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

随机推荐

  1. How do I copy files that need root access with scp

    server - How do I copy files that need root access with scp? - Ask Ubuntuhttps://askubuntu.com/quest ...

  2. 注意:QQ影音视频压缩时长丢失

    客户宣传片发来,高清的,比较大,500多M,需要转成小一点的,放在客户网站上,于是用QQ影音转码压缩下,变成低质量的.如下 一切都很顺利,提示进度100%! 这一切都是电脑自动的,又是提示成功的,千想 ...

  3. oracle篇 之 组函数

    一,常见组函数 1 . avg:求平均值,操作数值类型 2.sum:求和,操作数值类型 3.min:求最小值,操作任意类型 4.max:求最大值,操作任意类型 select avg(salary),s ...

  4. [模板] tarjan/联通分量/dfs树

    //to update 边的分类 有向图边分为四类: 树边, 前向边, 返祖边(后向边), 横叉边. 上图: 判定 有向图 对图进行dfs, 不考虑已经遍历过的点, 得到dfs序 \(dfn_i\). ...

  5. 前端动态菜单-bootstrap-treeview

    一.bootstrap-treeview 官网 Demo bootstrap-treeview是一款效果非常酷的基于bootstrap的jQuery多级列表树插件.该jQuery插件基于Twitter ...

  6. sql 查询字段如果为null 则返回0的写法

    oracle select nvl(字段名,0) from 表名; ----------------------------------- sqlserver select isnull(字段名,0) ...

  7. java8list排序

    https://blog.csdn.net/york_2016/article/details/80169467

  8. vim主题颜色

    1.VIM主题 查看Vim示例当前的颜色主题 打开一个Vim窗口,输入命令:color或:colorscheme后回车查看当前的颜色主题. Vim实例中设置颜色主题 输入命令"colorsc ...

  9. 【THUSC2017】【LOJ2981】如果奇迹有颜色 DP BM 打表 线性递推

    题目大意 有一个 \(n\) 个点的环,你要用 \(m\) 中颜色染这 \(n\) 个点. 要求连续 \(m\) 个点的颜色不能是 $1 \sim m $ 的排列. 两种环相同当且仅当这两个环可以在旋 ...

  10. 【BZOJ4028】[HEOI2015]公约数数列(分块)

    [BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...