[步骤阅读三]动态解析Jar
最后我们来设计计算器的窗体类,核心代码如下:
publicclassCalculateFrameextendsJFrame{
publicCalculateFrame(){
super("博为峰教育");
setBounds(200, 100, 600, 400);
setLayout(null);
txt1=newJTextField();
txt1.setBounds(20, 20, 200, 25);
add(txt1);
cbx=newJComboBox();
cbx.setBounds(20, 50, 80, 25);
add(cbx);
txt2=newJTextField();
txt2.setBounds(20, 80, 200, 25);
add(txt2);
bt=newJButton("计算结果");
bt.setBounds(20, 110, 120, 25);
add(bt);
//---- 开始为下拉控件添加选项 ----
// 定义jar存放的文件夹路径
Filepath=newFile("calculates/");
// 获取文件夹中的所有文件
File[]files=path.listFiles();
// 循环每一个文件
for(inti= 0 ;i<=files.length- 1;i++ ){
// 获取当前循环到的文件
Filefile=files[i];
try{
// 将当前循环到的文件 转换成 URL资源定位器
URLurl=file.toURL();
// 根据 URL资源定位器 生成URL类型加载器
URLClassLoaderloader=newURLClassLoader(newURL[]{url});
// 将当前循环到的文件 强转成 JarFile 类型
JarFilejarFile=newJarFile(file);
// 生成当前JarFile的迭代器
Enumerationen=jarFile.entries();
// 迭代解析JarFile中的每一个资源
while(en.hasMoreElements()){
// 获取当前迭代到的Jar资源
JarEntryjarEntry=en.nextElement();
// 判断当前迭代到的Jar资源是否是.class文件
if(jarEntry.getName().endsWith(".class") ){
// 通过当前迭代到的Jar资源文件名,转换成对应的类名
StringclassName=jarEntry.getName().replaceAll(".class","").replaceAll("/",".");
// 通过URL类型加载器,根据当前迭代到的类名,实例化计算对象
Calculatecalculate= (Calculate)loader.loadClass(className).newInstance();
// 将当前迭代到的计算对象 添加到 下拉控件的选项中
cbx.addItem(calculate.getSymbols());
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
//---- 结束为下拉控件添加选项 ----
// ---- 开始为按钮注册监听器 ----
bt.addMouseListener(newMouseListener() {
publicvoidmouseReleased(MouseEvente) {}
publicvoidmousePressed(MouseEvente) {}
publicvoidmouseExited(MouseEvente) {}
publicvoidmouseEntered(MouseEvente) {}
publicvoidmouseClicked(MouseEvente) {
// 获取用户当前选中的运算符
StringselectedItem=cbx.getSelectedItem().toString();
// 定义jar存放的文件夹路径
Filepath=newFile("calculates/");
// 获取文件夹中的所有文件
File[]files=path.listFiles();
// 循环每一个文件
for(inti= 0 ;i<=files.length- 1;i++ ){
// 获取当前循环到的文件
Filefile=files[i];
try{
// 将当前循环到的文件 转换成 URL资源定位器
URLurl=file.toURL();
// 根据 URL资源定位器 生成URL类型加载器
URLClassLoaderloader=newURLClassLoader(newURL[]{url});
// 将当前循环到的文件 强转成 JarFile 类型
JarFilejarFile=newJarFile(file);
// 生成当前JarFile的迭代器
Enumerationen=jarFile.entries();
// 迭代解析JarFile中的每一个资源
while(en.hasMoreElements()){
// 获取当前迭代到的Jar资源
JarEntryjarEntry=en.nextElement();
// 判断当前迭代到的Jar资源是否是.class文件
if(jarEntry.getName().endsWith(".class") ){
// 通过当前迭代到的Jar资源文件名,转换成对应的类名
StringclassName=jarEntry.getName().replaceAll(".class","").replaceAll("/",".");
// 通过URL类型加载器,根据当前迭代到的类名,实例化计算对象
Calculatecalculate= (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(Exceptione2){
e2.printStackTrace();
}
}
}
});
// ---- 结束为按钮注册监听器----
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
privateJTextFieldtxt1;
privateJTextFieldtxt2;
privateJComboBoxcbx;
privateJButtonbt;
}
实例化窗体并且运行后结果如下: