我是靠谱客的博主 正直狗,最近开发中收集的这篇文章主要介绍java基础——反射java基础——反射,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java基础——反射

什么是反射

Reflection(反射)Java 程序开发语言的特征之一,
	它允许运行中的 Java 程序对自身进行检查,或者说“自审”,也有称作“自省”。
	反射非常强大,它甚至能直接操作程序的私有属性。
	反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。

总结:反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

java中反射的用法中常见的几个:

一、在运行时获取一个类的 Class 对象

	//1、这种获取方式只有在编译前已经声明了该类的类型才能获取到 Class 对象
		Class<HashMap> hashMap= HashMap.class;
	//2、通过实例化对象获取该实例的 Class 对象
		Map<String, String> hashMap = new HashMap<>();
Class<? extends Map> hashMapClass = hashMap.getClass();
	//3、Class.forName(“类的全限定名”):通过类的全限定名获取该类的 Class 对象
		Class<?> hashMap= Class.forName("java.util.HashMap");

二、在运行时构造一个类的实例化对象

//通过反射构造一个类的实例方式有2种:
		//1、Class 对象调用newInstance()方法

        Class<?> hashMapClass = Class.forName("java.util.HashMap");
        HashMap hashMapInstance = (HashMap) hashMapClass.newInstance();

//注意:即使 HashMap已经显式定义了构造方法,通过 newInstance() 创建的实例中,所有属性值都是对应类型的初始值,因为 newInstance() 构造实例会调用默认无参构造器。

		//2、Constructor 构造器调用newInstance()方法

        Class<?> hashMapClass = Class.forName("java.util.HashMap");
        Constructor<?> constructor = hashMapClass.getConstructor();
        constructor.setAccessible(true);
        HashMap newInstance = (HashMap) constructor.newInstance();

//通过 getConstructor(Object… paramTypes) 方法指定获取指定参数类型的 Constructor, Constructor 调用 newInstance(Object… paramValues) 时传入构造方法参数的值,同样可以构造一个实例,且内部属性已经被赋值。通过Class对象调用 newInstance() 会走默认无参构造方法,如果想通过显式构造方法构造实例,需要提前从Class中调用getConstructor()方法获取对应的构造器,通过构造器去实例化对象。

三、在运行时获取一个类的所有信息:变量、方法、构造器、注解

//1、获取类中的变量(Field)

Field[] getFields():获取类中所有被public修饰的所有变量 Field getField(String
name):根据变量名获取类中的一个变量,该变量必须被public修饰 Field[]
getDeclaredFields():获取类中所有的变量,但无法获取继承下来的变量 Field
getDeclaredField(String name):根据姓名获取类中的某个变量,无法获取继承下来的变量

//2、获取类中的方法(Method)

Method[] getMethods():获取类中被public修饰的所有方法
Method getMethod(String name, Class…<?>
paramTypes):根据名字和参数类型获取对应方法,该方法必须被public修饰
Method[] getDeclaredMethods():获取所有方法,但无法获取继承下来的方法
Method getDeclaredMethod(String name, Class…<?>
paramTypes):根据名字和参数类型获取对应方法,无法获取继承下来的方法

//3、获取类的构造器(Constructor)

Constuctor[] getConstructors():获取类中所有被public修饰的构造器 Constructor
getConstructor(Class…<?> paramTypes):根据参数类型获取类中某个构造器,该构造器必须被public修饰
Constructor[] getDeclaredConstructors():获取类中所有构造器 Constructor
getDeclaredConstructor(class…<?> paramTypes):根据参数类型获取对应的构造器

常用方法

//获取包名 类名
clazz.getPackage().getName()//包名
clazz.getSimpleName()//类名
clazz.getName()//完整类名

//获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)

//获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)

//获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,int.class,String.class)

//反射新建实例
clazz.newInstance();//执行无参构造创建对象
clazz.newInstance(666,”海绵宝宝”);//执行含参构造创建对象
clazz.getConstructor(int.class,String.class)//获取构造方法

//反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量
clazz.setAccessible(true);//使私有成员允许访问
f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null

//反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
m.setAccessible(true);//使私有方法允许被调用
m.invoke(实例,参数数据);//让指定实例来执行该方法

反射的应用场景

1、Spring 实例化对象:当程序启动时,Spring 会读取配置文件applicationContext.xml并解析出里面所有的标签实例化到IOC容器中。
2、反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对各种新增的类,反射可以使得程序更加健壮。
3、JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类

最后

以上就是正直狗为你收集整理的java基础——反射java基础——反射的全部内容,希望文章能够帮你解决java基础——反射java基础——反射所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部