您的位置:首页 > 编程语言 > Java开发

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

2017-01-09 00:00 429 查看
[步骤阅读三]动态解析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;

}

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博为峰 Java Jar