java 日常学习记录-反射

时间:2023-03-09 15:35:28
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;
}
}
}