java基础复习—反射1、反射机制 2、反射作用 3、通过代码理解反射机制

标题: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”);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值