前言:
最近在复习Java基础,以前没有怎么注意到Java反射,复习Java反射的时候才发现反射这一块很重要,可能现在小弟内力还不够深厚,不足一下子全部掌握,反射概念有点抽象,我大概总结下自己所学的知识点吧。
概述:
反射是框架设计的灵魂
反射就是把java类中的各种成分映射成一个个的Java对象
反射:将类的各个组成部分封装为其他对象
好处:
- 可以在程序运行中,操作这些对象
- 可以解耦,提高程序的可扩展性
在这里(如图)描叙下类的加载:
Class对象的由来是将class文件读入内存,并为之创建一个Class对象
获取Class对象的方式:
1.Calss。forName("全类名"):将字节码文件加载进内存,返回Calss对象
*多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2.类名.class: 通过类名的属性class获取
*多用于参数的传递
3.对象.getClass()
*多用于对象的获取字节码的方式
public static void main(String[] args) throws Exception{
//Class。forName("全类名")
Class<?> aClass = Class.forName("com.reflect.study.demo.Person");
System.out.println(aClass);
//类名.class
Class<Person> personClass = Person.class;
System.out.println(personClass);
//对象.getClass()
Person person = new Person();
Class<? extends Person> aClass1 = person.getClass();
System.out.println(aClass1);
}
结论:
同一个字节码文件(*.class)再一次程序运行过程中,只会被加载一次,不论通过那种方式获取的class对象都是同一个
获取对象的成员变量们
public static void main(String[] args) throws Exception {
//获取对象的class对象
Class personClass = Person.class;
//获取成员变量们
//Field[] getFields() 获取所有public修饰的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("---------------");
Field a = personClass.getField("a");
//获取成员变量 a 的值
Person p = new Person();
Object value = a.get(p);
System.out.println(value);
//设置 a 的值
a.set(p,"科比");
System.out.println(p);
System.out.println("--------------");
//Field[] getDeclaredFields()获取所有的成员变量,不考虑修饰符
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
}
获取构造方法们
public static void main(String[] args) throws Exception {
Class<Person> personClass = Person.class;
Constructor constructor = personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
//创建对象
Object o = constructor.newInstance("张三", 23);
System.out.println(o);
}
获取成员方法们
public static void main(String[] args) throws Exception {
Class<Person> personClass = Person.class;
//获取指定方法
Method eat = personClass.getMethod("eat");
Person p = new Person();
eat.invoke(p);
Method eat1 = personClass.getMethod("eat", String.class);
eat1.invoke(p,"蔬菜");
//获取所有public修饰的方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
总结:
我大概也只是掌握一些Class类的API怎么去使用和大概知道反射是一个什么东东,至于怎么去程序中去使用它,我也不知道,知识尚未掌握,望自己还须更加努力!推荐一篇大佬写的博客: https://blog.csdn.net/sinat_38259539/article/details/71799078