类加载器
package Mail;
import org.apache.commons.io.IOUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader {
private String path = "";
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> myClass = findLoadedClass(name);
if (myClass!= null) return myClass;
if (name.endsWith(".Key")) return super.loadClass(name);
try {
byte[] bytes = IOUtils.toByteArray(new FileInputStream(path));
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.loadClass(name);
}
public Class<?> loadClass(String path, String name) throws ClassNotFoundException{
this.path = path;
return this.findClass(name);
}
}
使用案例
package Mail;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(555);
MyClassLoader myClassLoader = new MyClassLoader();
try {
//加载文件:Task.class,该类的包名+类名为:Mail.Task
Class<?> myClass = myClassLoader.loadClass("Task.class","Mail.Task");
//获得实例对象
Object obj = myClass.newInstance();
//获得字段对象
Field field = myClass.getField("text");
//获得方法对象
Method method = myClass.getMethod("start", null);
method.invoke(obj, null);
System.out.println(field.get(obj));
} catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
被加载的类定义
package Mail;
public class Task {
public String address;
public String subject;
public String text;
public void start() {
address = "[email protected]";
subject = "测试";
text = "5201314";
}
public boolean exec() {
return false;
}
public void stop() {
}
}
结语
这个东西,是我感兴趣做的,想在自己云服务器上运行一个自动给我每天发邮件的java程序,以提醒我每天该干什么,但是任务一直在变化,程序又不能频繁停下来,所以想到用Java的反射,将执行任务的类Task做成.class文件,用本地FTP放到云服务器指定目录即可,这样Task如何执行就是我在本地操作了,到时候只需要把文件上传上去就完事!