java基础--反射

java基础–反射

反射的基础介绍

  1. 什么是反射
    简单来说,反射是一种机制,通过该机制可以在程序运行过程中对类进行解剖,操作类的所有成员,包括构造方法,成员属性和成员方法
  2. 应用场景
    (1) 开发IDE(集成开发环境)
    (2) 开发框架

Class对象

  1. 介绍
    在这里插入图片描述
    使用反射则必须获取类对应的Class对象,每个类的Class对象都是唯一的
  2. 获取Class对象的方式
    (1) 类名.class
 	Class c1 = String.class;
 	System.out.println(c1);

在这里插入图片描述

(2) 对象调用getClass()方法,这个方法是Object类定义的

  	Class c2 = str.getClass();

(3) 通过Class类的静态方法forName(“类全名”)

 	Class c3 = Class.forName("java.lang.String");
	System.out.println(c1 == c2);

在这里插入图片描述

  1. Class类的常用方法
方法说明
String getSimpleName()获取类名
String getName获取类全名
T newInstance()创建类的对象,默认是通过无参构造方法创建对象(jdk1.9不再使用)
  1. Class类获取Constructor对象的方法
方法说明
Constructor getConstructor(Class… parameterTypes)获取Constructor对象 ,只能获取public修饰的构造方法对象。根据相应的参数类型获取构造方法对象,不传参数就是无参构造,传参则是有参构造。注意参数是Class类型
Constructor getDeclaredConstructor(Class… parameterTypes与上面的作用相同,而且还可以获取到private修饰的构造方法对象
Constructor[] getConstructors()获取所有public修饰的构造方法对象
Constructor[] DeclaredConstructors()获取所有的构造方法对象,包括private修饰的
  1. Class类获取Method的方法
方法说明
Method getMethod(String name,Class… params)根据名称与参数获取相应的Method对象,只能获取public修饰的。name表示方法名,params表示方法参数的class对象
Method getDeclaredMethod(String name,Class… params)与上面相同,包括获得private修饰的
Method[] getMethod获取所有public修饰的成员方法对象
Method[] getDeclareMethods()获取所有成员方法对象,包括private修饰的
  1. Class类获取Field对象的方法
方法说明
Field getField(String name)获取Filed对象,只能获取public修饰的
Field getDeclaredField(String name)获取Field对象,包括private修饰的
Field[] getFields()获取所有public修饰的成员变量相对应的Field对象
Field getDeclaredFields()获取所有成员变量对应的Field对象

Constructor类

  1. 概括
    类的每一个构造方法都是一个Constructor对象,在反射机制中,创建类的对象需要获得该类构造方法对应的Constructor对象

  2. Constructor常用方法

方法说明
T newInstance(Object… initargs)创建对象。不传参数就是无参构造,传参则是有参构造
void setAccessible(boolean flag)设置是否取消权限检查,设置为true才可以执行private修饰的构造方法

无参构造方法

		Class c = Student.class;
        //无参
        Constructor constructor = c.getConstructor();
        Student student = (Student) constructor.newInstance();
        System.out.println(student);

有参(public)

 	Class c = Student.class;
        //有参(public)
        Constructor constructor = c.getConstructor(int.class, String.class);
        Student student = (Student)constructor.newInstance(18, "张三"); // Student{id=18, name='张三'}
        System.out.println(student);

有参(private)

		Class c = Student.class;
        //有参(private)
        Constructor constructor = c.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);//true = 取消权限检查
        Student student = (Student) constructor.newInstance("李四");
        System.out.println(student);//Student{id=0, name='李四'}

Method类

  1. 概述
    类的每一个成员方法都对应一个Method对象,反射操作成员方法就是要获得成员方法对应的Method对象来调用该方法
  2. Method类常用方法
方法说明
Object invoke(Object obj, Object… args)执行方法。obj指定是哪一个对象的方法;args表示方法要传递的参数;invoke方法存在返回值,执行的方法返回什么invoke方法就返回什么
void setAccessible(boolean flag)设置是否取消权限检查,设置为true才能执行private修饰的方法

public

		Class c = Student.class;
        //学生对象
        Student student = (Student) c.newInstance();
        //获取public修饰的成员方法对象
        Method studyMethod = c.getMethod("study", String.class, int.class);
        studyMethod.invoke(student,"小明",3);

private

 Class c = Student.class;
        //学生对象
        Student student = (Student) c.newInstance();
        //获取private修饰的成员方法对象
        Method shoppingMethod = c.getDeclaredMethod("shopping", String.class);
        //取消权限检查
        shoppingMethod.setAccessible(true);
        //执行方法
        shoppingMethod.invoke(student,"小明");

静态方法

		Class c = Student.class;
        //学生对象
        Student student = (Student) c.newInstance();
        //获取public修饰的静态方法
        Method singMethod = c.getMethod("sing", String.class);
        //执行方法
        String result = (String) singMethod.invoke(null,"一首歌的时间");//执行静态方法不需要传入对象
        System.out.println(result);

Field类

  1. 概述
    类的每一个成员变量都对应一个Field对象,使用反射来操作成员变量,就是要获得成员变量对应的Field对象来给成员变量赋值和取值
  2. Field对象常用方法
方法名称
void set(Object obj, Object value)赋值。obj指定是哪一个对象的成员变量,value表示赋的值
void setxxx(Obejct obj, xxx i)xxx表示基本类型
Object get(Object obj)获取值。obj指定是哪一个对象的成员变量
xxx getxxx(Object obj)xxx表示基本类型。obj指定是哪一个对象的成员变量
void setAccessible(boolean flag)设置是否取消权限检查,设置为true才能获取或赋值private修饰的成员变量
Class getType()获取属性的类型,返回Class对象
String getName()获取属性名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值