为什么要获取字节码class对象
上一节我们说反射是将类的各个部分封装为其他对象我们想来操作这个类的各个部分的关键点就是获取字节码class类对象,比如在上文提到的Field[ ]
对象,我们想要操作Field[ ]
里的变量name
,age
等等就要获得class对象。
获取class对象的方式
还记得第一篇文一面提到的Java代码在计算机里面执行的三个阶段吗?,获取方式就是从每一个阶段来的。
第一种方式,从源代码阶段获取
该种方式是把Person.java
文件编译的Person.class
文件手动加载进内存,因为这个阶段的字节码文件Class还没有进内存,我们使用Class.forName(全类名)
将字节码加载进内存返回Class对象
例子:
我在skill
项目里面建立两个包java_practce
和reflect
又分别在两个包里面建了一个Person.java
和ReflectDemol.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进厂必刷