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设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
随机推荐
- centos 6.8 配置 Redis3.2.5
配置Redis3.2.5 与 php-redis 一.配置Redis 1.下载Redis3.2.5安装包 [root@zhangsan /] wget http://download.redis.io ...
- 移除 iview的Table组件固定两头后box-shadow阴影效果
.ivu-table-fixed{ box-shadow:0 0 0 #fff; }
- keras03 Aotuencoder 非监督学习 第一个自编码程序
# keras# Autoencoder 自编码非监督学习# keras的函数Model结构 (非序列化Sequential)# 训练模型# mnist数据集# 聚类 https://www.bili ...
- react中的this.setState()
修改组件的状态可以使用的一些方法: 1.比较常用的 this.setState({ message:"你好" }) 2.state更新是异步的时候 因为this.props和thi ...
- Asp.net mvc 动作方法中 调用 另一个控制器的动作方法
public ActionResult 动作方法(){ var otherController = DependencyResolver.Current.GetService<另一个控制器的类名 ...
- Python Scrapy突破反爬虫机制(项目实践)
对于 BOSS 直聘这种网站,当程序请求网页后,服务器响应内容包含了整个页面的 HTML 源代码,这样就可以使用爬虫来爬取数据.但有些网站做了一些“反爬虫”处理,其网页内容不是静态的,而是使用 Jav ...
- 使用c++如何实现在gRPC中传输文件
使用c++实现gRPC远程调用框架中传输文件,proto文件如下: syntax = "proto3"; package transferfile; service Transfe ...
- Centos7 安装gitLab
我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils openssh-server open ...
- Docke--利用 commit 理解构建镜像
Docker 利用commit理解构建镜像 镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础.当我们使用Docker Hub的镜像无法满足我们的需求时,我们就 ...
- php5.4、5.5、5.6高版本中htmlspecialchars兼容性处理
在使用php5.4以上版本以上时会有一个函数可能会报错 如下 Warning: htmlspecialchars(): charset `gbk' not supported, assuming ut ...