Java反射(使用场景非常多!)

反射

生活中的反射

太阳光照射到镜子上,会发生反射。反射时光的方向会发生改变(略微的反向)。

代码中的反射,改变了我们使用对象的方式。之前:对象调方法,对象设置属性。反射刚好反了一下。方法调用对象,属性调用对象。

在Java中反射是比较底层的内容,想要实现反射需要使用Class类

什么是Class类

类是相同事物的抽象。类在描述一类事物。例如:人都有姓名,性别,年龄,还有吃饭、睡觉、打豆豆。

通过创建对象,可以形成各种不同的人。

类是由谁来描述的呢?Class就是描述类的类。类也有共性,属性,方法,构造器,父类,接口。每一个类都有对应一个Class实例。你可以认为一个Class对象对应的是一个xx.class文件。

Class没有创建方法,每个类的Class实例是在这个类的class文件加载到内存中的时候,由ClassLoader创建。我们只能获取Class类的对象。

Class类有以下几种获取方式:

  1. 类名.class

    基本数据类型也可以获取对应的Class实例 用法是int.class double.class 普通类获取Class对象的方法:String.class Person.class

  2. 对象.getClass()

  3. Class.forName(“类的完整字符串描述”)

		//获取Class对象的方式一: 类名.class
		Class class1 = int.class;
		System.out.println(class1);
		Class class2 = String.class;
		System.out.println(class2);
		Class class3 = Person.class;
		System.out.println(class3);
		
		//获取Class对象的方式二: 对象.getClass();
		String str = "hello";
		Class class4 = str.getClass();
		System.out.println(class4);
		System.out.println(class4 == class2);
		Person p = new Person();
		Class class5 = p.getClass();
		System.out.println(class5);
		System.out.println(class3 == class5);
		
		
		//获取Class对象的方式三: Class.forName("完整类名")
		Class class6 = Class.forName("java.util.ArrayList");
		System.out.println(class6);
		
		Class class7 = Class.forName("com.lanou.lessonclass.Person");
		System.out.println(class7);

反射

在Java中提供了一套机制,这种机制允许你通过Class对象来获取类的全部信息(属性,方法,构造器,接口,父类,注解等等),获取之后,你可以对他们做你想做的事情。哪怕是私有的也可以操作。

通过Class对象获取类的属性

在Java中Filed类是用于描述属性的类。

通过Class对象获取类的属性的方式有4个:

getFields() //获取类中所有的public属性(含继承链上的public属性)

getField(String name) //获取类中指定名称的public属性。(含继承链上的 public属性)

getDeclaredFields() //获取类中所有的属性(不含继承链上的属性)

getDeclaredFiled(String name) //获取类中指定名称的属性

通过Class对象获取类的构造器

在Java中Constructor类用于描述类的构造器。

通过Class对象获取类的构造器的方式有4个:

getConstructor(Class …parameterTypes) // 获取本类中指定参数的public构造器

getConstructors() //获取本类中全部的public构造器

getDeclaredConstructor(Class…parameterTypes) //获取本类中指定参数的构造器

getDeclaredConstructors() //获取本类中全部的构造器。

通过Class对象获取类的方法

在Java中Method是用于描述类的方法。

通过Class对象获取类的方法的方式有4种:

getMethods() // 获取全部的public方法(含继承链上的方法)

getMethod(String methodName, Class…parameterTypes) //获取指定名称的public方法

getDeclaredMethods() //获取本类中所有的方法

getDeclaredMethod(String methodName, Class…paremeterTypes) //获取本类中指定名称的方法。

反射的作用

反射给的第一感觉:脱了裤子放屁!

实际上反射的价值就在于能动态获取信息!

虽然写了很多很多代码,但是代码一旦写成,复用性很高。而且不需要导包!因为Class.forName(“类名”)可以以字符串的方式获取类名,再通过类名得到类的Class对象。

反射多用于写框架,几乎所有的框架底层都是靠反射实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值