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感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!