如果把java代码放到数据库里~~

  数据库作为存储数据的地方,在进行项目开发的时候,往往会把项目中的有用数据都放到数据库进行持久化,那数据库除了存数据,能不能存代码呢?
  这是个有意思的事情,如果我们能把代码当成数据存在到数据库中,这样就可以不再为一些杂七杂八的活动业务逻辑上线,设计一个通用的表达公式啥的,直接写完代码丢到数据库里,不就得了,同时还避免了重启服务的风险。
  代码实际上也算是二进制数据,按理来说,存放到数据库是完全可行的,但是鉴于避免在数据库存放大对象的原则,可以变相地通过存入代码文件的路径,等要使用的时候,直接解析代码文件就可以使用了。而java的代码加载形式作为动态链接的一种方式,这更加方便我们的使用。
  在实现这一功能的时候,就可以使用jvm的类加载机制。
  首先实现自定义的ClassLoader去加载数据库中存储的class文件,如下实现一个通过控制台窗口来动态加载对应的类的功能:

public static class LocalClassLoader extends ClassLoader {
        @Override
        public Class loadClass(String name) throws ClassNotFoundException {
            if (!name.startsWith("CountWith")) return super.loadClass(name);
            String filepath = "C:\\Users\\Administrator\\Desktop\\clz\\" + name + ".class";
            try (InputStream is = new FileInputStream(filepath)) {
                int size = is.available();
                byte[] bs = new byte[size];

                int count = 0;
                while ((count = is.read(bs, count, size - count)) != -1) {
                }

                return defineClass(null, bs, 0, bs.length);
            } catch (IOException e) {
                e.printStackTrace();
                throw new ClassNotFoundException();
            }
        }
    }

Count接口:

public interface Count {
    public int count(int i, int j);
}

一个Count接口的实现类:

public class CountWith1 implements Count {
    @Override
    public int count(int i, int j) {
        return i + j + 1;
    }
}

主流程代码:

public class HotDeployDemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        ClassLoader cl = new LocalClassLoader();
        Scanner scanner = new Scanner(System.in);
        String clzName = null;
        while (!(clzName = scanner.next()).equals("end")) {
            Class clz = cl.loadClass(clzName);
            Count count = (Count) clz.newInstance();
            System.out.println(count.count(1, 1));
        }
    }
}

  将上述代码中filePath路径直接替换成数据库中的数据,就可以变相实现了将java代码放到数据库中的功能了。

总结:

  代码实际上也算是数据的一种特殊表现形式,作为数据的一种,它实际上也是可以进行修改或增删的,比如cglib的aop技术实际上就是通过解析并自动编写类的子类代码。
  将代码作为数据进行操作,还有一种更为超神的操作,就是把代码在运行期间的运行栈作为一种特殊数据,进行增添、传递、回放的操作,这在Scheme语言中的协程实现这一复杂操作。

你可能感兴趣的:(如果把java代码放到数据库里~~)