如何创建用户定义的 javap 工具?
什么是 javap 工具?
javap工具用于获取任何类或接口的信息。 javap 命令(也称为Java反汇编器)反汇编一个或多个类文件。它的输出取决于使用的选项(“ -c ”或“ -verbose ”分别用于字节码和字节码以及内部信息)。如果没有使用任何选项,javap 会打印出传递给它的类的包、受保护和公共字段和方法。
句法:
javap [classname] [option]
为了清楚地理解它,请参阅下面的命令提示符示例,该示例打印 String 类的详细信息
使用的命令是:
javap java.lang.String
输出:
如何创建用户定义的 javap 工具?
要创建用户定义的 javap 工具,我们将使用Java.lang.class 的以下方法
- Method[] getDeclaredMethods():该方法返回一个Method对象,该对象反映了该Class对象所代表的类或接口的指定声明方法。
- Field[] getDeclaredFields():该方法返回一个Field对象数组,反映了这个Class对象所代表的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。
- Constructor[] getDeclaredConstructors():此方法返回一个 Constructor 对象数组,反映了此 Class 对象所代表的类声明的所有构造函数。这些是公共的、受保护的、默认(包)访问和私有构造函数。
我们还将使用Java的反射 API。反射 API 用于在运行时检查或修改方法、类、接口的行为。
以下程序实现用户定义的 javap 工具:
例 1:在这个例子中,我们在用户定义的类上使用这个程序。
// The program implements
// user defined javap tool
// Import Reflection
import java.lang.reflect.*;
// Test class on which
// custom javap tool will be used
class test_class {
// Variables
int a;
double d;
char c;
String s;
// Constructors
test_class()
{
a = 0;
d = 0.0;
c = 'a';
s = "Hello";
}
test_class(int a, double d, char c, String s)
{
this.a = a;
this.d = d;
this.c = c;
this.s = s;
}
// Some class Methods
void printData()
{
System.out.println(a + d + c + s);
}
void setData()
{
a = 1;
d = 0.0;
c = 'A';
s = "Hello Geeks";
}
}
// Custom javap tool
public class javapcustom {
public static void main(String[] args)
throws Exception
{
Class class_name = Class.forName("test_class");
// Print field of class
System.out.println("Fields of class");
Field f[] = class_name.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
System.out.println(f[i]);
}
// Print constructor of class
System.out.println("\nConstructors of class");
Constructor cons[] = class_name.getDeclaredConstructors();
for (int i = 0; i < cons.length; i++) {
System.out.println(cons[i]);
}
// Print methods of class
System.out.println("\nMethods of class");
Method method[] = class_name.getDeclaredMethods();
for (int i = 0; i < method.length; i++)
System.out.println(method[i]);
}
}
输出:
Fields of class
int test_class.a
double test_class.d
char test_class.c
java.lang.String test_class.s
Constructors of class
test_class(int, double, char, java.lang.String)
test_class()
Methods of class
void test_class.printData()
void test_class.setData()
示例 2:在此示例中,我们在预定义的Java类上使用此用户定义的 javap 工具。
// The program implements
// user defined javap tool
// Import Reflection
import java.lang.reflect.*;
// Custom javap tool
public class javapcustom {
public static void main(String[] args)
throws Exception
{
// You can replace args[0] with
// the name of predefined Class
// on which you want to use javap tool
// eg: replace args[0] with "java.lang.String"
Class class_name = Class.forName(args[0]);
// Print field of class
System.out.println("Fields of class");
Field f[] = class_name.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
System.out.println(f[i]);
}
// Print constructor of class
System.out.println("\nConstructors of class");
Constructor cons[] = class_name.getDeclaredConstructors();
for (int i = 0; i < cons.length; i++) {
System.out.println(cons[i]);
}
// Print methods of class
System.out.println("\nMethods of class");
Method method[] = class_name.getDeclaredMethods();
for (int i = 0; i < method.length; i++)
System.out.println(method[i]);
}
}
输出: