小博老师解析Java核心技术 ——动态解析Jar的运用

本文介绍了一种使用Java动态解析Jar文件的方法,并将其应用于计算器应用的设计中。该计算器可以从多个Jar包中动态加载不同的计算逻辑。

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

[步骤阅读三]动态解析Jar

最后我们来设计计算器的窗体类,核心代码如下:

public class CalculateFrame extends JFrame{

public CalculateFrame(){

super("博为峰教育");

setBounds(200, 100, 600, 400);

setLayout(null);

txt1 = new JTextField();

txt1.setBounds(20, 20, 200, 25);

add(txt1);

cbx = new JComboBox();

cbx.setBounds(20, 50, 80, 25);

add(cbx);

txt2 = new JTextField();

txt2.setBounds(20, 80, 200, 25);

add(txt2);

bt = new JButton("计算结果");

bt.setBounds(20, 110, 120, 25);

add(bt);

//---- 开始为下拉控件添加选项 ----

// 定义jar存放的文件夹路径

File path = new File("calculates/");

// 获取文件夹中的所有文件

File[] files = path.listFiles();

// 循环每一个文件

forint i = 0 ; i <= files.length - 1; i++ ){

// 获取当前循环到的文件

File file = files[i];

try{

// 将当前循环到的文件 转换成 URL资源定位器

URL url = file.toURL();

// 根据 URL资源定位器 生成URL类型加载器

URLClassLoader loader = new URLClassLoader(new URL[]{url});

// 将当前循环到的文件 强转成 JarFile 类型

JarFile jarFile = new JarFile(file);

// 生成当前JarFile的迭代器

Enumeration<JarEntry> en = jarFile.entries();

// 迭代解析JarFile中的每一个资源

while(en.hasMoreElements()){

// 获取当前迭代到的Jar资源

JarEntry jarEntry = en.nextElement();

// 判断当前迭代到的Jar资源是否是.class文件

ifjarEntry.getName().endsWith(".class") ){

// 通过当前迭代到的Jar资源文件名,转换成对应的类名

String className = jarEntry.getName().replaceAll(".class""").replaceAll("/"".");

// 通过URL类型加载器,根据当前迭代到的类名,实例化计算对象

Calculate calculate = (Calculate)loader.loadClass(className).newInstance();

// 将当前迭代到的计算对象 添加到 下拉控件的选项中

cbx.addItem(calculate.getSymbols());

}

}

}catch(Exception e){

e.printStackTrace();

}

}

//---- 结束为下拉控件添加选项 ----

// ---- 开始为按钮注册监听器    ----

bt.addMouseListener(new MouseListener() {

public void mouseReleased(MouseEvent e) {}

public void mousePressed(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {

// 获取用户当前选中的运算符

String selectedItem = cbx.getSelectedItem().toString();

// 定义jar存放的文件夹路径

File path = new File("calculates/");

// 获取文件夹中的所有文件

File[] files = path.listFiles();

// 循环每一个文件

forint i = 0 ; i <= files.length - 1; i++ ){

// 获取当前循环到的文件

File file = files[i];

try{

// 将当前循环到的文件 转换成 URL资源定位器

URL url = file.toURL();

// 根据 URL资源定位器 生成URL类型加载器

URLClassLoader loader = new URLClassLoader(new URL[]{url});

// 将当前循环到的文件 强转成 JarFile 类型

JarFile jarFile = new JarFile(file);

// 生成当前JarFile的迭代器

Enumeration<JarEntry> en = jarFile.entries();

// 迭代解析JarFile中的每一个资源

while(en.hasMoreElements()){

// 获取当前迭代到的Jar资源

JarEntry jarEntry = en.nextElement();

// 判断当前迭代到的Jar资源是否是.class文件

ifjarEntry.getName().endsWith(".class") ){

// 通过当前迭代到的Jar资源文件名,转换成对应的类名

String className = jarEntry.getName().replaceAll(".class""").replaceAll("/"".");

// 通过URL类型加载器,根据当前迭代到的类名,实例化计算对象

Calculate calculate = (Calculate)loader.loadClass(className).newInstance();

// 判断当前迭代到的计算对象 是否就是 用户选择的计算符号

if(calculate.getSymbols().equals(selectedItem)){

// 设置参与计算的数据

calculate.setNum1(Double.parseDouble(txt1.getText()));

calculate.setNum2(Double.parseDouble(txt2.getText()));

// 计算结果

JOptionPane.showMessageDialog(getContentPane(), calculate.getResult());

return;

}

}

}

}catch(Exception e2){

e2.printStackTrace();

}

}

}

});

// ---- 结束为按钮注册监听器    ----

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

private JTextField txt1;

private JTextField txt2;

private JComboBox cbx;

private JButton bt;

}

实例化窗体并且运行后结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值