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

[步骤阅读三]动态解析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;

}

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

小博老师解析Java核心技术 ——动态解析Jar的运用_第1张图片

你可能感兴趣的:(小博老师解析Java核心技术 ——动态解析Jar的运用)