欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 中如何获取字节码文件的相关内容

程序员文章站 2024-03-02 23:39:04
java 中如何获取字节码文件的相关内容 反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法;对任意一个对象,都能调用这个对象的方法...

java 中如何获取字节码文件的相关内容

反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法;对任意一个对象,都能调用这个对象的方法和属性。这种动态的获取信息和动态的调用对象的方法的功能称为——java语言的反射机制。

简单点说,动态的获取类中的信息,这就是java的反射机制。

在java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数、成员变量和成员函数等。在接下来,作者将分别演示如何通过类名来获取类中包含的信息。

一、获取字节码文件的构造函数

import java.lang.reflect.constructor;

public class getclassconstructor {
  public static void main(string[] args) throws exception {
    createnewobject_2();
  }

  public static void createnewobject_2() throws exception {
    /**
     * 当获取指定名称对应类中的所体现的对象时,而且该对象的初始化不适用空参的构造函数
     * 可以先通过该类的字节码文件对象,获取空参的构造函数
     * 该方法为:getconstructor(parametertypes)
     */

  // 包名一定要写全,否则会报"java.lang.classnotfoundexception"异常
  string name = "src.person";
    // 找寻该名称类文件,并加进内存,产生class对象
    class clazz = class.forname(name);
    // 获取指定的构造函数对象
    constructor constructor = clazz.getconstructor(string.class, int.class);
    // 通过该构造器对象的newinstance进行对象的初始化
    constructor.newinstance("小明", 12);
  }

  public static void createnewobject() throws classnotfoundexception, instantiationexception, illegalaccessexception {
    string name = "src.person";
    // 找寻该名称类文件,并加进内存,产生class对象
    class clazz = class.forname(name);
    // 产生该类的实例对象(空参)
    object obj = clazz.newinstance();
  }
}

二、获取字节码文件的成员变量

import java.lang.reflect.field;

public class getclassfield {
  public static void main(string[] args) throws exception {
    getfield();
  }

  /**
   * 获取字节码文件中的成员变量
   */
  public static void getfield() throws exception {
    class clazz = class.forname("src.person");
    field field = null;

    // 获取本类字段,包含私有
    field = clazz.getdeclaredfield("age");

    // 对私有字段的访问取消权限检查,可称之为暴力访问
    field.setaccessible(true);

    object obj = clazz.newinstance();

    field.set(obj, integer.valueof(89));

    object o = field.get(obj);
    system.out.println(o);
  }
}

三、获取字节码文件的成员函数

import java.lang.reflect.constructor;
import java.lang.reflect.method;

public class getclassmethod {
  public static void main(string[] args) throws exception {
    getmethod_3();
  }

  public static void getmethod_3() throws exception {
    class clazz = class.forname("src.person");
    method method = clazz.getmethod("walkinfo", new class[]{string.class, integer.type});
    object obj = clazz.newinstance();
    method.invoke(obj, new object[]{"小强", integer.valueof(20)});
  }

  public static void getmethod_2() throws exception {
    class clazz = class.forname("src.person");

    // 获取空参数的方法
    method method = clazz.getmethod("show", (class[]) null);
    constructor constructor = clazz.getconstructor(new class[]{string.class, integer.type});
    object obj = constructor.newinstance(new object[]{"小明", integer.valueof(12)});
    method.invoke(obj, (object[]) null);
  }

  /**
   * 获取指定class中的公有函数
   */
  public static void getmethod() throws exception {
    class clazz = class.forname("src.person");

    // 获取的都是类中的公有方法
    method[] methods = clazz.getmethods();

    // 获取本类中的所有方法
    methods = clazz.getdeclaredmethods();
    method[] var5 = methods;
    int var4 = methods.length;

    for (int var3 = 0; var3 < var4; ++var3) {
      method method = var5[var3];
      system.out.println(method);
    }
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!