Java 反射
Class 对象
类加载器加载字节码文件到方法区,同时会生成类的Class对象放入
Class对象的主要构成包括
- 成员变量 Filed[] fields
- 构造方法 Construct[] cons
- 成员方法 Method [] methods
什么是反射
将类的各个组成部分封装成其他对象,利用这些对象就是反射
获取Class对象的方法
- 源码阶段:Class.forName(“全类名”);将字节码文件加载进内存,返回Class对象
- 类对象阶段:类名.Class 通过类名的属性class获取
- 运行时阶段:对象.getClass() :getClass()在Object对象中
同一个字节码文件按在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个。
Class对象的功能
-
获取成员变量(Field)
getFields()// 必须是public修饰的成员变量 getField(String name)// 必须是public修饰的成员变量 getDeclaredField(String name) //不考虑修饰符 getDeclaredFields()//不考虑修饰符
-
获取构造方法(Constructor)
getConstructors() getConstructor(Class<?>... parameterTypes) getDeclaredConstructor(Class<?>... parameterTypes)//不考虑修饰符 getDeclaredConstructors()
-
获取成员方法(Method)
getDeclaredMethods()//不考虑修饰符 getDeclaredMethod(String name, Class<?>... parameterTypes)//不考虑修饰符 getMethod(String name, Class<?>... parameterTypes)// 必须是public修饰的成员方法 getMethods()// 必须是public修饰的成员方法
Method 对象
Method method= personalClass.getMethod("methodName");//获取指定方法名
Person p = new Person();
method.invoke(p);//执行方法
Field对象
Class cla = Class.forName("Person");
Person person = new Person();
Field field= cla.getField("name");
field.set(person,"hello");
System.out.println(person);
Constructor对象
Class cla = Class.forName("Person");
Person person = new Person();
Constructor constructor = cla.getConstructor(String.class, int.class);
Object p = constructor.newInstance("name",18);
System.out.println(p);