小博老师解析Java核心技术 ——动态解析Jar的运用
2017-01-09 21:15
393 查看
[步骤阅读三]动态解析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();
// 循环每一个文件
for( int 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文件
if( jarEntry.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();
// 循环每一个文件
for( int 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文件
if( jarEntry.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;
}
实例化窗体并且运行后结果如下:
最后我们来设计计算器的窗体类,核心代码如下:
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();
// 循环每一个文件
for( int 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文件
if( jarEntry.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();
// 循环每一个文件
for( int 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文件
if( jarEntry.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;
}
实例化窗体并且运行后结果如下:
相关文章推荐
- 小博老师解析Java核心技术 ——动态解析Jar的运用
- 小博老师解析Java核心技术 ——动态解析Jar的运用
- 小博老师解析Java核心技术 ——动态解析Jar的运用
- 小博老师解析Java核心技术 ——动态解析Jar的运用
- 小博老师解析Java核心技术 ——动态解析Jar的运用
- 小博老师解析Java核心技术 ——单例模式的运用
- 小博老师解析Java核心技术 ——单例模式的运用
- 小博老师解析Java核心技术 ——JSwing文本型控件
- 小博老师解析Java核心技术 ——JSTL核心标签库
- 小博老师解析Java核心技术点 ——表单令牌(一)
- 小博老师解析Java核心技术 ——KindEditor文本编辑器使用
- 小博老师解析Java核心技术点 ——表单令牌(二)
- 小博老师解析Java核心技术 ——JSwing选择型控件
- 小博老师解析Java核心技术 ——JSwing高级菜单制作
- 小博老师解析Java核心技术点-验证码制作
- 小博老师解析Java核心技术 ——JSwing基本菜单制作
- 小博老师解析Java核心技术 ——JSwing窗体布局
- 小博老师解析Java核心技术 ——JSwing文本域和滚轴控件
- 小博老师解析Java核心技术点
- 小博老师解析Java核心技术点