重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
由于开发需要(为界面提供扩展外观),最近研究了一下从运行Jar中代码的实现。发现Java中的ClassLoader搭配上反射功能就能实现,基本思路如下:
创新互联建站专注于企业营销型网站建设、网站重做改版、尼金平网站定制设计、自适应品牌网站建设、H5开发、商城建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为尼金平等各大城市提供网站开发制作服务。
编写一个接口,让编写的外部需要运行的类(要放到Jar中的)实现这个接口。
通过ClassLoader加载那个Jar文件,得到一个Class。然后newInstance()创建一个对象
然后按照接口中的方法去调用指定函数
代码例子:
制作一个Java的记事本程序(NotePad)
然后会从Style.jar中加载程序所需要的样式
其中Style.jar中有一个MyStyle的类实现了一个StyleInterface的接口
接口代码如下:
public interface StyleInterface {
public String getStyle();
}
MyStyle类的代码如下:
public class MyStyle implements StyleInterface{
@Override
public String getStyle() {
return "我是从MyStyle中得到的样式代码!";
}
}
然后,在记事本主程序程序中通过如下方式调用:
String class_path = "MyStyle";//Jar中的所需要加载的类的类名
String jar_path = ":\Style.jar";//jar所在的文件的URL
try {
ClassLoader cl = new URLClassLoader(new URL[]{new URL(jar_path)});//从Jar文件得到一个Class加载器
Class? c = cl.loadClass(class_path);//从加载器中加载Class
StyleInterface sif = (StyleInterface) c.newInstance();//从Class中实例出一个对象
System.out.println(sif.getStyle());//调用Jar中的类方法
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
注意:
class_path必须是完整类名(连同所在的包的路径),例如:在myjava.test下有一个类Test,则Test的完整类名是:myjava.test.Test.而如果是在"缺省包"下的类,就可以省略包的路径(本来就没有)。
jar_path不是Jar文件的路径,而是Jar文件的URL。
通常可以这样表示:"文件的绝对路径"
从Class中实例出对象时,一定要把Object强制转换成实现指定接口的类,就想例子中的StyleInterface
我写了一个,内容比较简单的。代码如下:public class AnimalTest {
Animal animal;
public void eat(Animal animal){
animal.eat();
}
public void walk(Animal animal){
animal.walk();
}
public static void main(String args[]){
Animal animal=new Animal("animal");
Wolf w=new Wolf("wolf");
Goat g=new Goat("goat");
AnimalTest at=new AnimalTest();
at.eat(animal);
at.eat(w);
at.eat(g);
at.walk(animal);
at.walk(w);
at.walk(g);
}
}
class Animal {
String name;
public Animal(String name){
this.name=name;
}
public Animal(){}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void eat(){
System.out.println("animal eat");
}
public void walk(){
System.out.println("animal walk");
}
public String toString(){
return name;
}
}class Wolf extends Animal {
public Wolf(String name){
super(name);
}
public Wolf(){}
public void eat(){
System.out.println("wolf eat meat");
}
public void walk(){
System.out.println("wolf walk");
}
public String toString(){
return name;
}
}class Goat extends Animal {
public Goat(String name){
super(name);
}
public Goat(){}
public void eat(){
System.out.println("goat eat grass");
}
public void walk(){
System.out.println("goat walk");
}
public String toString(){
return name;
}
}
Application 程序如下:
public class Welcome {
public static void main(String[] args)
{
System.out.println("欢迎来到java编程世界");
}
}
Applet 程序如下:
import java.awt.Container;
import javax.swing.JLabel;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
public class WelcomeApplet extends JApplet
{
public void init()
{
Container con = getContentPane();
JPanel panel = new JPanel();
JLabel label = new JLabel("欢迎来到java编程世界");
panel.add(label);
JButton okButton = new JButton("OK");
panel.add(okButton);
con.add(panel);
}
}
把源文件编译成class文件,再创建一个HTML文件,代码如下:
applet code="WelcomeApplet.class" width=300 height=100
/applet
application:
public class Test;
public static void main(String args[]){
System.out.println("欢迎进入精彩java世界");
}
applet:
applet代码:
import java.awt.*;
import java.applet.Applet;
public class TestApplet extens Applet ;
public void paint(Graphics g){
g.drawString("欢迎进入精彩java世界",40,80);
}
html代码:
html
body
applet code="TestApplet.class"
/body
/html