Java 利用反射加载*.class文件到JVM源码+使用案例

类加载器

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如何执行就是我在本地操作了,到时候只需要把文件上传上去就完事!

猜你喜欢

转载自blog.csdn.net/weixin_45792450/article/details/104396866
今日推荐