反射的思想

本文介绍了Java反射的基本概念,包括获取Class对象的三种方式:类名.class,对象名.getClass(),Class.forName()。接着详细讲解了如何通过反射获取并使用构造方法、成员变量和成员方法,以及反射在实际应用中如何越过泛型检查,提供了一种动态创建对象和调用方法的灵活机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

前言:针对最近几天对反射的学习,做出一些自己的理解,希望能帮助到大家,有不对的地方请指出。


一、反射概述

是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。

二、获取Class类对象的三种方式

1.类名.class属性

Class<Student> c1 = Student.class;
System.out.println(c1);

2.对象名.getClass()方法

 Student s = new Student();
 Class<? extends Student> c3 = s.getClass();

3.Class.forName(全类名)方法

//使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("test.Student");

三、反射获取构造方法并使用

1.Class类获取构造方法对象的方法

  • Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
  • Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
  • Constructor getConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象
  • Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回单个构造方法对象

我这里用第三个举例说明:

Class<?> c = Class.forName("File.Student");
Constructor<?> c2 = c.getConstructor();
System.out.println(c2);
Object obj = c2.newInstance();
System.out.println(obj);

2.Constructor类用于创建对象的方法

  • T newInstance(Object…initargs) 根据指定的构造方法创建对象

四、反射获取成员变量并使用

  • Field[] getFields() 返回所有公共成员变量对象的数组
  • Field[] getDeclaredFields() 返回所有成员变量对象的数组
  • Field getField(String name) 返回单个公共成员变量对象
  • Field getDeclaredField(String name) 返回单个成员变量对象
        Field addressFiled = c.getDeclaredField("address");
        //暴力反射,true取消访问检查
        addressFiled.setAccessible(true);
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        addressFiled.set(obj,"西安");
        System.out.println(obj);
  • voidset(Object obj,Object value) 给obj对象的成员变量赋值为value

五、反射获取成员方法并使用

  • Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的
  • Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承的
  • Method getMethod(String name, Class<?>… parameterTypes) 返回单个公共成员方法对象
  • Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回单个成员方法对象
        Method m = c.getMethod("method");
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        m.invoke(obj);
        System.out.println("------");
        Method method = c.getDeclaredMethod("method1", String.class);
        method.setAccessible(true);
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        method.invoke(obj,"李四");
  • Objectinvoke(Object obj,Object… args) 调用obj对象的成员方法,参数是args,返回值是Object类型

六、反射练习之越过泛型检查

        ArrayList<Integer> array=new ArrayList<Integer>();
//        Class<? extends ArrayList> cl = array.getClass();
//        Method m = cl.getMethod("add", Object.class);
//        m.invoke(array,"hello");
//        m.invoke(array,20);
//        System.out.println(array);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值