如何创建一个用户定义的Javap工具
有时候,我们需要与类文件有关的信息。在这种情况下,我们可以使用Java开发工具包(JDK)提供的javap工具。我们可以获取与类中存在的方法、构造函数和字段相关的更多信息。javap工具的目的是反汇编一个或多个类文件。它也被称为Java类文件反汇编器。使用javap工具,我们可以获取关于特定类的字节码信息的更多信息。输出可能会根据使用的选项而有所不同。
语法
javap的语法如下:
javap [options] [classes]
解释:
javap关键字用于开始,后跟选项命令。选项是可选参数。选项可以是一个或多个,并以空格分隔。以下是Java中常用的一些选项。
- -help : 用于显示javap菜单的帮助信息。
-
-version : 用于打印发行版本信息。
-
-l : 用于显示行号和局部变量。
-
-public : 用于显示公共类和公共成员。
-
-protected : 用于显示受保护的类和私有成员。
-
-c : 用于反汇编代码。
-
-sysinfo : 用于显示系统信息。
示例
为了理解javap工具的工作原理,让我们在命令提示符上执行该命令。
javap java.util.Scanner
在这里,我们使用javap命令对java.util包中的Scanner类进行反汇编。以下图片显示了上述代码的输出结果。它显示了类的修饰符、公共方法以及有关类的详细信息。使用javap工具在命令提示符下工作的先决条件是安装了JDK。
输出
用户自定义的Javap工具
现在我们知道可以对预先构建的类使用javap工具,也可以对用户自定义的类使用javap工具。
步骤
- 创建一个用户自定义的类。添加构造函数和方法。
-
在Main类中,获取与自定义类相关联的类实例。我们使用Class.forName()方法。
-
然后显示自定义类的类字段。使用getDeclaredFields()方法返回Field对象数组。包括所有公共的、私有的、受保护的和默认的字段。
-
使用getDeclaredConstructors()方法显示类的构造函数。我们得到定义在自定义类中的构造函数数组。包括所有公共的、私有的、受保护的和默认的构造函数。
-
使用getDeclaredMethods()方法获取所有类方法,该方法返回一个方法数组。
示例
以下是一个创建用户自定义javap工具的示例。
import java.lang.reflect.*;
// class to use custom javap tool
class Customclass{
int x;
float y;
String z;
// class constructor
Customclass()
{
x = 19;
y=89.78894532f;
z="javap";
}
//class methods
void printData()
{
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
//custom javap tool
public class Main {
public static void main(String[] args) throws Exception
{
Class cn = Class.forName("Customclass");
//display the fields
System.out.println("Class fields");
Field[] field= cn.getDeclaredFields();
for (int i=0;i<field.length;i++) {
System.out.println(field[i]);
}
System.out.println("\n");
//display the constructor
System.out.println("Class constructors");
Constructor[] cs= cn.getDeclaredConstructors();
for (int i=0;i<cs.length;i++) {
System.out.println(cs[i]);
}
System.out.println("\n");
//display the methods
System.out.println("Class methods");
Method[] m= cn.getDeclaredMethods();
for (int i=0;i<m.length;i++)
System.out.println(m[i]);
}
}
输出
以下是上述代码的输出结果
Class fields
int Customclass.x
float Customclass.y
java.lang.String Customclass.z
Class constructors
Customclass()
Class methods
void Customclass.printData()
解释
我们使用之前提到的方法获取了类的字段,构造函数和方法。由于我们的类有3个字段- int,float和String变量,它们被打印出来。这里有一个构造函数和一个方法。