借助BCEL

BCEL是一个java字节码引擎库,有了他我们可以方便的表示出class文件的数据,另外BCEL还支持动态的创建和改变java class文件。这里我仅是初略的了解BCEL解释class文件的功能,为我后面学习FindBugs工具做准备,需要深入学习BCEL的创建、改变class文件的功能,可以查看官方文档。

这是org.apache.bcel.classfile包下的类,可以看到这些类展示了class文件所有的数据结构,JavaClass是一个java class文件的抽象,他可以通过ClassParser来得到。另外可用通过JavaClass实例来得到Constant、Field、Method等所用class文件数据:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String classPath = "K:\\....\\HeapSort.class";
    try {
        JavaClass jClass = new ClassParser(classPath).parse();
        //Class2HTML class2html = new Class2HTML(jClass, "K:\\....\\");
        Method[] methods = jClass.getMethods();
        Method me = null;
        for(Method method : methods){
            System.out.println(method.toString());
            if(method.getName().equals("sort")) me = method;
        }

        System.out.println(me.toString());
        Code code = me.getCode();
        System.out.println(code.toString());
        Attribute[] attribute = me.getAttributes();
        System.out.println(attribute[0].toString());

        ConstantPool pool = jClass.getConstantPool();
        Constant[] constants = pool.getConstantPool();
        System.out.println("constant 数量:"+constants.length);
    } catch (ClassFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这里就不展示输出结果了,在org.apache.bcel.util包中有些工具类,如使用Class2HTML类可以把class文件的一些数据展示到HTML文件中:

上面展示的有所有的常量,class的属性,和方法中的code属性。这里提一下,上图中可以看到该class文件中共包括了89个常量,但在上述代码输出中我们得到常量个数为90。正好与了解Java Class文件结构中提到的constant_pool_count这个值等于常量池中常量数量加1相符。

时间: 2024-10-08 11:13:08

借助BCEL的相关文章

Aspect Oriented

AO技术不是为了替代OO技术出现的,它的出现是为了对OO技术进行辅助和增强 1.基本概念 1.1关注点 在AO技术中,软件系统可以由一组关注点来组成,关注点是系统开发过程中所关心的方面,如系统的功能.安全性和性能等等.(可以理解为一系列需求,只不过这些需求由不同的Stakeholder来关注) 1.2横切关注点 虽然在OO技术中我们已经强调了模块化.封装的作用,也已经有了如类.包等模块化机制,但是系统中还是存在的一些关注点(主要来自系统的非功能性需求)典型如:系统的业务逻辑.系统数据持久存储.系

这是一款借助chrome 插件的微信机器人

1.chrome kit微信机器人简介(github:https://github.com/LinuxForYQH/chrome_kit) 借助chrome 插件 js注入来实现消息的发送 chrome devtool api的调用来监听https请求 打开微信登录界面,在扫码登录前必须先打开toolbar(F12 或者 鼠标右键检查),如上所说因为借助了chrome devtool api所以需要打开toolbar才能执行相关dev域的js. 2.相关开发原理介绍 https://develo

借助queue的层次遍历---c++

今天的收获: 1.c++中存在queue模板 queue<template type> vec; vec.push(); vec.pop(); queue 没有清空操作,clear()等函数,因此可以定义一个新的空队列 queue< ** > newqu,然后 swap(vec,newqu ),这样就清空vec 了. 2.借助queue的层次遍历 思想:在遍历该节点时,将它的孩子几点入队. /** * Definition for a binary tree node. * str

不借助任何中间变量将两个整形变量的值交换

今天在做题的时候,突然出现一道题,就是不借助中间变量,将两个整形变量的值互换,开始有点懵,这怎么换?后来还是用两个变量不停做加减变换,差不多有十几分钟,才终于凑出来了一种方法,一时兴起,我又从网上找了一下相关的资料,说是竟然有四种方法,我就看了一下,顺便学习一下. 在我们初学阶段,一般是定义一个新的变量,借助它完成交换. 例如:int a,b;a=1; b=2;int t;t=a; a=b; b=t;这种算法易于理解,对初学者来说,一般都是用“空瓶子来回倒换”帮助理解的,而且是赋值语句的经典应用

词典的实现(2)-借助顺序表(数组)实现词典

一,思路 1,词典实现类ArrayDictionary.java肯定要implements 词典的接口DictionaryInterface.java(参考:http://www.cnblogs.com/hapjin/p/4573826.html).其次,为了序列化,还要implements Serializable接口 2,由于词典中的每个元素是一个键值对.因此,需要将查找键 和 值 封装在同一个对象中,因而定义了Entry.java来表示词典中的每个元素.其中,Entry类是作为ArrayD

ctrl+z的JAVA实现,借助了命令模式(command pattern)

前些天学习<<JAVA与模式>>,到命令模式时,随带给了一个CTRL+Z案例的实现,想来学习编程这么久,CTRL+Z还没有认真实现过. 因此,借助JAVA与模式里面的源代码,自己对撤销和回退进行了实现(JAVA与模式书中代码有部分问题).此次用到了命令模式,因为有界面,有按钮,有接收者,有发送者. 以下是类图,只为方便,未考虑UML细节规范. 以下是程序的实现. MainFrame类:提供Main方法,Client类:类似于看电视的人,这里关联了UndoableTextArea,I

Uploadify—借助Uploadify插件实现图片预览时如何解决Chrome浏览器报“喔唷,崩溃啦”

今天借助Uploadify插件实现了图片预览及其上传的功能,可是在Chrome浏览器中会时不时地出现如下图所示的情况: 解决方法:使用这种方法引用该插件js文件: <script type="text/javascript"> document.write("<script type='text/javascript' src='<%=basePath %>js/uploadify/jquery.uploadify.min.js?" +

Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载

在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BCEL).与 Javassist 所支持的源代码接口不同,BCEL 在实际的 JVM 指令层次上进行操作.在希望对程序执行的每一步进行控制时,底层方法使 BCEL 很有用,但是当两者都可以胜任时,它也使 BCEL 的使用比 Javassist 要复杂得多. 我将首先讨论 BCEL 基本体系结构,然后本

借助过度区选择阈值

主要思想:       借助图像的有效平均梯度(EAG)的计算以及图像灰度的剪切操作来确定边缘的灰度值. 有效平均梯度(EAG):计算非0值梯度 剪切操作:设有一个阈值L ,灰度大于L的为原值,小于L的为L.或者,小于L的为L,大于L的为原值. (个人感觉这个方法不靠谱,有待未来实践证实) 来自为知笔记(Wiz) 借助过度区选择阈值,布布扣,bubuko.com