步步UP2️⃣——反射的获取字节码Class对象和Class对象功能概述

为什么要获取字节码class对象

上一节我们说反射是将类的各个部分封装为其他对象我们想来操作这个类的各个部分的关键点就是获取字节码class类对象,比如在上文提到的Field[ ]对象,我们想要操作Field[ ]里的变量nameage等等就要获得class对象。

获取class对象的方式

还记得第一篇文一面提到的Java代码在计算机里面执行的三个阶段吗?,获取方式就是从每一个阶段来的。
在这里插入图片描述

第一种方式,从源代码阶段获取

该种方式是把Person.java文件编译的Person.class文件手动加载进内存,因为这个阶段的字节码文件Class还没有进内存,我们使用Class.forName(全类名)将字节码加载进内存返回Class对象
例子:
在这里插入图片描述

我在skill项目里面建立两个包java_practcereflect又分别在两个包里面建了一个Person.javaReflectDemol.java现在在ReflectDemol.java做如下操作:
例1

package reflect;

public class ReflectDemol {
	public static void main(String[] args) throws ClassNotFoundException {
		//Class.forName("全类名")
		Class cs=Class.forName("java_practice.Person");
		System.out.println(cs);
	}

}

结果:
class java_practice.Person

常使用场景

因为Class.forName("全类名")要写全类名,全类名是一个字符串所以这种方式多用于配置文件,我们将类名配置在文件中来加载类。

第二种方式,从Class类对象阶段

🏆该阶段已经在内存里面了,我们通过类名的属性.class获取
配置和第一种方式一样,下面看实操;
例1

package reflect;

import java_practice.Person;

public class ReflectDemol {
	public static void main(String[] args) throws ClassNotFoundException {
		Class cs=Person.class;
		System.out.println(cs);
	}

}

结果:
class java_practice.Person

常使用场景

经常使用于参数的传递

第三种方式,从运行时阶段

🏆在运行阶段我们已经可以创建对象了。我们可以直接创建对象获取也就是常见的new Person()
然后对创建的对象使用getClass()方法该方法在在object类中定义着。(即所有对象都有这个方法)
例1
同上配置:

package reflect;

import java_practice.Person;

public class ReflectDemol {
	public static void main(String[] args) throws ClassNotFoundException {
		Person cs=new Person();
		System.out.println(cs.getClass());
	}

}
结果:
class java_practice.Person

常使用场景

🏆因为这种方式已经建立了一个对象,所以经常用于对象的获取字节码的方式。

总结对比

🏆由上面例1我们总结出:同一个字节码文件(比如例1 Person.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个。

Class对象功能概述

记住一句话:想了解一个类或者方法最好的方法就是去看元代码,而且这也是一个程序员必备的技能
在这里插入图片描述
进去之后你会发现有很多的方法,我们下面介绍一下

获取功能

🏆1·获取成员变量
比如这个
在这里插入图片描述
下面我不一 一截图了大家可以自己找一下:

还有Field[ ] getField(String name)

Field[] getDeclaredField(String name)

Field[] getDeclaredField(String name)

🏆2·获取构造方法
和上面获取变量一样我们也简单说几个


 Constructor<?>[] getConstructors()
 
 Constructor<T> getConstructor(Class<?>... parameterTypes)

 Constructor<?>[] getDeclaredConstructors()

 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

🏆3·获取普通方法(成员方法)

 Method[] getMethods()
 
 Method getMethod(String name, Class<?>... parameterTypes)

 Method[] getDeclaredMethods()
 
 Method getDeclaredMethod(String name, Class<?>... parameterTypes)


🏆4·获取类名
同理合上面一样你可以自己去探索。
找不到也没关系我们下面将逐一介绍这些常用的方法
尽情期待

详情请关注:JavaWeb进厂必刷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥学

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值