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

 更新时间:2017年04月06日 09:48:48   投稿:lqh  
这篇文章主要介绍了java 中如何获取字节码文件的相关内容的相关资料,需要的朋友可以参考下

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);
    }
  }
}

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

相关文章

  • java AOP原理以及实例用法总结

    java AOP原理以及实例用法总结

    在本篇文章里我们给大家整理了关于java AOP原理以及相关知识点总结,正在学习的朋友们参考下。
    2019-05-05
  • 学习java多线程

    学习java多线程

    本文运用了大量的代码讲解了java多线程,它可以提高程序并行执行的速度,更快的响应程序。感兴趣的小伙伴一起来看看吧
    2021-08-08
  • 使用指定的JDK启动IDEA的三种方法

    使用指定的JDK启动IDEA的三种方法

    今天小编就为大家分享一篇关于使用指定的JDK启动IDEA的三种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot文件上传功能的实现方法

    SpringBoot文件上传功能的实现方法

    这篇文章主要介绍了SpringBoot文件上传功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • navicatdesignquery.sql.bak系统找不到指定路径错误的解决方法

    navicatdesignquery.sql.bak系统找不到指定路径错误的解决方法

    今天小编就为大家分享一篇关于navicatdesignquery.sql.bak系统找不到指定路径错误的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • JavaWeb编程 Servlet的基本配置

    JavaWeb编程 Servlet的基本配置

    本文讲的是Servlet最基本的配置信息,相信对你一定有帮助
    2013-11-11
  • SpringBoot 整合 Shiro 密码登录的实现代码

    SpringBoot 整合 Shiro 密码登录的实现代码

    这篇文章主要介绍了SpringBoot 整合 Shiro 密码登录的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java实现经典游戏飞机大战-I的示例代码

    Java实现经典游戏飞机大战-I的示例代码

    《飞机大战-I》是一款融合了街机、竞技等多种元素的经典射击手游。本文将利用java语言实现这游戏,文中采用了swing技术进行了界面化处理,感兴趣的可以了解一下
    2022-02-02
  • Spring中的retry重试组件详解

    Spring中的retry重试组件详解

    这篇文章主要介绍了Spring中的retry重试组件详解,Retry重试组件是一个处理重试逻辑的工具,可以在出现异常或失败情况下自动进行重试操作,从而提高程序的稳定性和可靠性,需要的朋友可以参考下
    2023-10-10
  • mybatis拦截器注册初始化编写示例及如何生效详解

    mybatis拦截器注册初始化编写示例及如何生效详解

    这篇文章主要为大家介绍了mybatis拦截器注册初始化编写示例及如何生效详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论