一种能力,并能根据自身行为的状态和结果,调整或修改
应用所描述行为的状态和相关的语义。
看这个概念很晕的
反射机制的作用:
1.反编译 .class ---> .java
2.通过反射机制访问java对象的属性,方法,构造方法等
反射机制的好处:解耦合,降低耦合度,提高安全性,可维护性
三阶段:
1.Source 源码阶段 类加载器ClassLoader加载进内存,就成了对象
2.Class类阶段 String name Field[] fieldd 字段 Method[] methods 方法 Constructor[] cons构造器 newInstance()对象
3.runtime阶段 创建对象 调用方法
获取Class对象的三种方法:
1.反射 Class.forName("");
2.类名.class
3.obj.getClass();
Demo3:
/*
*Class对象能干什么?
* 获取对象
* 创建对象
* 获取字段
* 获取方法
* 获取构造器
*/
ReflectDemo3.java:
public class ReflectDemo3 {
publicstatic void main(String[] args) throws Exception {
//获取对象
Classclazz = Class.forName("com.reflect.Demo3.Student");
Objectobj = clazz.newInstance();
// System.out.println(obj+"asdfghj");
//获取所有公共字段(getFields())
Field[]fields = clazz.getFields(); //只能得到类公共的字段
for(Field field : fields) {
// System.out.println(field.getName());
}
//获取所有字段(getDeclaredFields())
Field[]fields2 = clazz.getDeclaredFields();
for(Field field : fields2) {
// System.out.println(field.getName());
}
//获取某个字段1
Fieldsex = clazz.getField("sex");
sex.set(obj,1);
// System.out.println(obj);
//获取某个字段2
Fieldname = clazz.getDeclaredField("name");
name.setAccessible(true); //暴力反射,取消访问的权限检查(查询field)
name.set(obj,"xxx");
// System.out.println(obj);
//获取方法1
Method[]methods = clazz.getMethods(); //获取公共的方法,包括父类的
for(Method method : methods) {
// System.out.println("method:"+method.getName());
}
//获取方法2
Method[]declaredMethods = clazz.getDeclaredMethods(); //获取本类定义的所有方法,没有父类的
for(Method method : declaredMethods) {
System.out.println("method:"+method.getName()+"*****");
}
//获取构造器
Constructor[]cons = clazz.getConstructors();
for(Constructor constructor : cons) {
System.out.println(constructor.getName());//以字符串形式返回此构造方法的名称。
System.out.println(constructor.getModifiers());//获取修饰符 返回值int类型
System.out.println(Modifier.toString(constructor.getModifiers()));//获取修饰符
}
}
}
Student.java:
public class Student {
privateString name;
privateint age;
publicint sex; //公有的
publicString getName() {
returnname;
}
publicvoid setName(String name) {
this.name= name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age= age;
}
publicint getSex() {
returnsex;
}
publicvoid setSex(int sex) {
this.sex= sex;
}
@Override
publicString toString() {
return"Student [age=" + age + ", name=" + name + ",sex=" + sex + "]";
}
publicStudent(String name, int age, int sex) {
this.name= name;
this.age= age;
this.sex= sex;
}
publicStudent() { }
publicStudent(String name) {
this.name= name;
}
}