java 中如何获取字节码文件的相关内容
java中如何获取字节码文件的相关内容
反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法;对任意一个对象,都能调用这个对象的方法和属性。这种动态的获取信息和动态的调用对象的方法的功能称为——Java语言的反射机制。
简单点说,动态的获取类中的信息,这就是Java的反射机制。
在Java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数、成员变量和成员函数等。在接下来,作者将分别演示如何通过类名来获取类中包含的信息。
一、获取字节码文件的构造函数
importjava.lang.reflect.Constructor;
publicclassGetClassConstructor{
publicstaticvoidmain(String[]args)throwsException{
createNewObject_2();
}
publicstaticvoidcreateNewObject_2()throwsException{
/**
*当获取指定名称对应类中的所体现的对象时,而且该对象的初始化不适用空参的构造函数
*可以先通过该类的字节码文件对象,获取空参的构造函数
*该方法为:getConstructor(parameterTypes)
*/
//包名一定要写全,否则会报"java.lang.ClassNotFoundException"异常
Stringname="src.Person";
//找寻该名称类文件,并加进内存,产生Class对象
Classclazz=Class.forName(name);
//获取指定的构造函数对象
Constructorconstructor=clazz.getConstructor(String.class,int.class);
//通过该构造器对象的newInstance进行对象的初始化
constructor.newInstance("小明",12);
}
publicstaticvoidcreateNewObject()throwsClassNotFoundException,InstantiationException,IllegalAccessException{
Stringname="src.Person";
//找寻该名称类文件,并加进内存,产生Class对象
Classclazz=Class.forName(name);
//产生该类的实例对象(空参)
Objectobj=clazz.newInstance();
}
}
二、获取字节码文件的成员变量
importjava.lang.reflect.Field;
publicclassGetClassField{
publicstaticvoidmain(String[]args)throwsException{
getField();
}
/**
*获取字节码文件中的成员变量
*/
publicstaticvoidgetField()throwsException{
Classclazz=Class.forName("src.Person");
Fieldfield=null;
//获取本类字段,包含私有
field=clazz.getDeclaredField("age");
//对私有字段的访问取消权限检查,可称之为暴力访问
field.setAccessible(true);
Objectobj=clazz.newInstance();
field.set(obj,Integer.valueOf(89));
Objecto=field.get(obj);
System.out.println(o);
}
}
三、获取字节码文件的成员函数
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Method;
publicclassGetClassMethod{
publicstaticvoidmain(String[]args)throwsException{
getMethod_3();
}
publicstaticvoidgetMethod_3()throwsException{
Classclazz=Class.forName("src.Person");
Methodmethod=clazz.getMethod("walkInfo",newClass[]{String.class,Integer.TYPE});
Objectobj=clazz.newInstance();
method.invoke(obj,newObject[]{"小强",Integer.valueOf(20)});
}
publicstaticvoidgetMethod_2()throwsException{
Classclazz=Class.forName("src.Person");
//获取空参数的方法
Methodmethod=clazz.getMethod("show",(Class[])null);
Constructorconstructor=clazz.getConstructor(newClass[]{String.class,Integer.TYPE});
Objectobj=constructor.newInstance(newObject[]{"小明",Integer.valueOf(12)});
method.invoke(obj,(Object[])null);
}
/**
*获取指定Class中的公有函数
*/
publicstaticvoidgetMethod()throwsException{
Classclazz=Class.forName("src.Person");
//获取的都是类中的公有方法
Method[]methods=clazz.getMethods();
//获取本类中的所有方法
methods=clazz.getDeclaredMethods();
Method[]var5=methods;
intvar4=methods.length;
for(intvar3=0;var3
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!