读入一个class文件,输出它的所有的字段、方法

本文通过一个具体的Java代码示例介绍了如何实现一个自定义的类加载器。该类加载器从文件系统中读取类文件,并将其加载到Java虚拟机中。文章展示了类加载的过程,包括使用FileInputStream读取类文件、通过ByteBuffer进行内存映射以及利用自定义类加载器的方法defineClass将字节码转换为Class对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;

public class ClassLoaderTest extends ClassLoader{

    static final String className ="C://Test.class";

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, IOException {
        ClassLoaderTest clt = new ClassLoaderTest();
        FileInputStream fis = new FileInputStream(className);
        FileChannel fc = null;
        if (fis != null) {
            fc = fis.getChannel();
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        WritableByteChannel wbc = Channels.newChannel(baos);
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
        while (true) {
            int i = fc.read(buffer);
            if (i == 0 || i == -1) {
                break;
            }
            buffer.flip();
            wbc.write(buffer);
            buffer.clear();
        }
        fis.close();
        byte[] bytes = baos.toByteArray();

        Class clz = clt.defineClass("Test", bytes, 0, bytes.length);
        System.out.println(clz.getName());

        Field[] fields = clz.getFields();
        for(Field field: fields)
            System.out.println(field.getName());


        Method[] methods = clz.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }

        Class[] clis = clz.getInterfaces();
        for (Class cli : clis) {
            System.out.println(cli.getName());
        }


        fis.close();
        baos.close();

    }
}

转载于:https://my.oschina.net/jimyao/blog/648154

实验一  手工构造简单词法分析程序(必修) 一、实验目的 了解词法分析程序的基本构造原理,掌握简单词法分析程序的手工构造方法。 二、实验内容 对从键盘输入或从文件读入的形如: “const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。 三、实验要求 1、输入的常量说明串,要求最后以分号作结束标志; 2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容; 3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线; 4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不以0开头的若干数字加上小数点再后跟若干数字的组合; 5、统计并输出串或文件中包含的各种类型的常量个数; 6、以二元组(类型,值)的形式输出各常量的类型和值; 7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编译器对不同错误情况做出相应处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值