在jdk的配置环境中 从俩个地方体现出:一个是XML解析 另一个是实体类 而实体类则需要运用反射
jdk里面jre转译:是将.java文件转化为.class的文件
而今天我们说的是反射 它是将.class文件转为.java文件
1. 什么是反射?
反射是java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法2.反射3大作用
实例化对象
c.newInstance() --实例化
动态调用方法
Method m; --找到方法
m.invoke --调用
读写属性
Field set/get --设置值和获取 Field f=p.getDeclaredField("属性名"); 得到单个属性 Field [] fall=person.getDeclaredFields(); 得到全部的属性
3.如何运行反射?
比如: 新建实体类Person,设置好三个字段:pid pname psex ,通过反射得到该类所有的属性和方法,父类,并调用方法(无参无返回,无参有返回,有参数无返回,有参数有返回).
一切反射相关的代码都从获得类对象开始 以下有三个获取类对象的方法
1 Class.forName(完整类名) --(我们最常用的一种)
2 类名.class
3 对象.getClass()
创建实体类Person 写4个简单方法
public class Person{
//implements Reflect
/**
* id
*/
private String pid;
/**
* 姓名
*/
private String pname;
/**
* 性别
*/
private String psex;
//无参无返回
public void m1() {
System.out.println("m1");
}
//无参有返回
public String m2() {
return "m2";
}
//有参数无返回
public void m3(String pid, String pname, String psex) {
System.out.println(pid+pname+psex);
}
//有参数有返回
public String m4(String pid, String pname, String psex) {
return pid+pname+psex;
}
}
写反射的内容 读写属性
//得到类对象
Class person=Class.forName("com.list.reflect.Person");
//实例化对象
Object p=null;
//属性 Field f=p.getDeclaredField("pid"); 得到单个属性
//得到Person全部的属性 是一个数组getDeclaredFields 类对象获取全部的属性
Field [] fall=person.getDeclaredFields();
for (Field f : fall) {
//设置可以访问 千万别忘记啦
f.setAccessible(true);
//实例化对象
p=person.newInstance();
//赋值
if("pid".contains(f.getName())) {
f.set(p, "001");
}
else if("pname".contains(f.getName())) {
f.set(p, "张张");
}
else if("psex".contains(f.getName())) {
f.set(p, "女");
}
//得到全部的属性
System.out.println(f.getName());
}
调用方法
Method [] method=person.getDeclaredMethods();
for (Method m : method) {
p=person.newInstance();
if("m1".contains(m.getName())) {
m.invoke(p, null);
//System.out.println(m.getParameterTypes());
}
if("m2".contains(m.getName())) {
System.out.println(m.invoke(p, null));
}
if("m3".contains(m.getName())) {
System.out.println(m.invoke(p, "010","张家人","男"));
}
if("m4".contains(m.getName())) {
System.out.println(m.invoke(p, "003","王jk","男"));
}
//得到所有的方法
System.out.println(m.getName());
}
总结:感觉自己懂得反射的东西并不是很深,需要在深入的去思考和钻研,今天就写了一些简单的代码,以后知道的话会补上一些遗漏的知识点的 ,以下再附上一张关于反射的知识点,从一位大神那里纳莱的 ,嘿嘿,就这样吧!