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

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

(0)

相关推荐

  • java 获取字节码文件的几种方法总结

    java 获取字节码文件的几种方法总结 在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式, 其具体思想及代码如下所示: public class Person { private int age; private String name; public Person() { System.out.println("person run"); } public Person(String name, int age) { this.age = age; this.n

  • Java字节码指令集的使用详细

    Java虚拟机指令由一个字节长度的.代表某种特定含义的操作码(Opcode)以及其后的零个至多个代表此操作参数的操作数构成.虚拟机中许多指令并不包含操作数,只有一个操作码.若忽略异常,JVM解释器使用一下为代码即可有效工作. 复制代码 代码如下: do{    自动计算PC寄存器以及从PC寄存器的位置取出操作码    if(存在操作数) 取出操作数;    执行操作码所定义的操作;}while(处理下一次循环) 操作数的数量以及长度,取决于操作码,若一个操作数长度超过了一个字节,将会以Big-E

  • java字节码框架ASM的深入学习

    一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 使用ASM框架需要导入asm的jar包,下载链接:

  • 通过java字节码分析学习对象初始化顺序

    复制代码 代码如下: mockery.checking(new Expectations() { {               one(new Object()).toString();               will(returnValue(""));           }       }); 下面写一个写一个简单的类演示这个例子 复制代码 代码如下: public class Test { int i = 1;    {        int j = 1;       

  • java字节码框架ASM操作字节码的方法浅析

    之前我们已经对ASM进行的详细的介绍,需要的朋友们可以点击这里:java字节码框架ASM的深入学习 JVM的类型签名对照表 Type Signature Java Type Z boolean B byte C char S short I int J long F float D double L fully-qualified-class ;fully-qualified-class [ type type[] ( arg-types ) ret-type method type 比如,ja

  • Java 将字符串动态生成字节码的实现方法

    可以生成可执行的class文件 直接上能执行代码: 复制代码 代码如下: public class Test { /**  * @param args  */@SuppressWarnings("static-access")public static void main(String[] args) {  try {   new Test().calculate("234 - ( 1 + 45 * 4 ) / 5");  } catch (Exception e)

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

    java 中如何获取字节码文件的相关内容 反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法:对任意一个对象,都能调用这个对象的方法和属性.这种动态的获取信息和动态的调用对象的方法的功能称为--Java语言的反射机制. 简单点说,动态的获取类中的信息,这就是Java的反射机制. 在Java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数.成员变量和成员函数等.在接下来,作者将分别演示如何通过类名来获取类中包含的信息.

  • Java中Spring获取bean方法小结

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

  • JDK动态代理之ProxyGenerator生成代理类的字节码文件解析

    通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成代理类的字节码.ProxyGenerator这个类存放在sun.misc包下,我们可以通过OpenJDK源码来找到这个类,该类的generateProxyClass()静态方法的核心内容就是去调用generateClassFile()实例方法来生成Class文件.我们直接来看generateClas

  • java中如何获取时间戳的方法实例

    前言 数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(引用自百度百科) 在java开发过程中经常会遇到统计某一天或是某一个月的数据,因此常常需要获取截取数据的两个时间戳(比如统计今天的数据,则需要获取一个开始时间为今天零点以及一个结束时间为明天零点),然后根据数据相关的时间是否在该时间区间内来判断是否将其计入统计数据中. 一.java获取时间戳 话不多说,首先我们先拿上面的例

  • Java中如何获取mysql连接的3种方法总结

    前言 本文主要来说说三种 Java 中获取 mysql 连接的方式,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 第一种:传统的连接方式: 第二种:读取配置文件方式: 第三种:数据库连接池. 一.传统的连接方式: 首先在 src 目录下创建名为 lib 的文件夹,导入数据库驱动的 jar 包,随后 "add to build path". 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 2.获取连接 S

  • JAVA中读取文件(二进制,字符)内容的几种方法总结

    JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); In

  • java中如何获取相关参数

    此文通过一段代码来展示java获取相关参数的方法分享给大家: public static void main(String[] args) { Properties props=System.getProperties(); //系统属性 System.out.println("Java的运行环境版本:"+props.getProperty("java.version")); System.out.println("Java的运行环境供应商:"+

  • 解析Java中如何获取Spring中配置的bean

    一.什么是Spring?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 二.如何在程序中获取Spring配置的bean呢?方法一:在初始化时保存ApplicationContext对象代码: 复制代码 代码如下: ApplicationContext ac = new FileSystemXmlApplicationContex("applicationContext.xml");    ac.getBean("beanId"); 说明:

  • Java中实现获取路径的方法汇总

    一. java文件中获得路径 Thread.currentThread().getContextClassLoader().getResource("") //获得资源文件(.class文件)所在路径 ClassLoader.getSystemResource("") Class_Name.class.getClassLoader().getResource("") Class_Name.class .getResource("/&qu

随机推荐