标题:java基础复习—反射
学习内容:
1、反射机制
2、反射作用
3、通过代码理解反射机制
内容详情:
1、反射机制
Person person =new Person();
首先这个简单的创造对象的过程
Person 在方法区,保存的是这个类的信息
person 在栈,是一个变量,它指向堆内存的new Person();对象
new Person();在堆内,它指向方法区的类信息
经过javac编译后生成的字节码文件通过类加载器,加载进内存,关于类的信息都在方法区,反射机制就是将类的各个组成部分封装成其它的对象。方法区里面就封装了属性信息,方法信息等。
2、反射作用
Java反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时获取泛型信息
在运行时调用任意一个对象的成员变量和方法
在运行时处理注解
生成动态代理
3、通过代码理解反射机制
关于java.lang.Class类的理解
方法区里面的类信息就是java.lang.Class类的一个实例,例如,有个Person类的信息,那么这个Person类就是java.lang.Class类的一个实例。
获取Class类的三种方式代码
其中方式三是最常用的
package reflect;
public class ReflectTest {
public static void main(String[] args) throws Exception {
//方式一:通过运行类.class调用
Class<Person> clazz = Person.class;
System.out.println(clazz);
//方式二:通过类的对象调用
Person person = new Person();
Class clazz1 = person.getClass();
System.out.println(clazz1);
//方式三:通过调用Class的静态方法forName("全类名")
Class clazz2= Class.forName("reflect.Person");
System.out.println(clazz2);
}
}
获取了Class类的类信息之后,就可以获取对象,属性,方法等等了。
获取类的对象
Class clazz = Class.forName("reflect.Person");
Object o = clazz.newInstance();
System.out.println(o);
获取类的属性
Class clazz = Class.forName("reflect.Person");
//获取所有public属性clazz.getFields();
Field[] fields = clazz.getFields();
for(Field f:fields){
System.out.println(f);
}
System.out.println("_________________________________________________");
//获取所有属性clazz.getDeclaredFields();
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f1:declaredFields){
System.out.println(f1);
}
获取类的方法
Class clazz = Class.forName("reflect.Person");
//获取所有public方法clazz.getMethods();
Method[] methods = clazz.getMethods();
for(Method m:methods){
System.out.println(m);
}
//获取所有方法clazz.getMethods();
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m1:declaredMethods){
System.out.println(m1);
}
方法太多就不截图了
调用属性,方法
//调用属性
//1.获取Class实例
Class clazz = Class.forName("reflect.Person");
//2.获取实例的对象
Object o = clazz.newInstance();
//3.获取任意属性
Field age = clazz.getDeclaredField("age");
//4.调用的时候,忽略权限问题
age.setAccessible(true);
//5.给对象o的age赋值为5
age.set(o,10);
System.out.println(o);
//调用方法
//1.获取Class实例
Class clazz1 = Class.forName("reflect.Person");
//2.获取实例的对象
Object o1 = clazz1.newInstance();
//3.获取任意方法,参数一为方法名,参数二为方法的参数类型
Method declaredMethod = clazz1.getDeclaredMethod("setAddress", String.class);
//4.调用的时候,忽略权限问题
age.setAccessible(true);
//5.invoke()方法,给获取的方法赋值,第一个参数是对象,第二个是值。
declaredMethod.invoke(o1,"湖南省");
System.out.println(o1);
主要是理解,一般情况是Person person =new Person();
而反射是通过Class类获取Person类信息,然后可以获得类的属性,方法等
Class clazz = Class.forName(“reflect.Person”);