动态代理的基础--内存中生成字符串代码并编译加载

动态代理是很多框架都在使用的技术,现在不少框架的类动态生成使用的是cglib,最近想起jdk1.6开放了类的编译api尝试做了个demo。

一.类的动态生成方式:

1.使用编译时注解,编译时生成.java文件,让jdk编译为class

2.使用字符串拼接代码,cglib生成.class文件

3.使用字符串拼接成代码,JavaCompiler生成class文件

二.JavaCompiler实际使用

1.生成动态代码,这里为了简便直接拼装一个class出来,为了验证实现接口也能编译出来,我加上了一个接口。

public static String getClassJava() {
    StringBuilder builder = new StringBuilder("package com.xsq.test");
    builder.append(";import com.xsq.test.compiler.TestInte;");
    builder.append("public class TestLoadClass implements TestInte{ public void test(){  System.out.println(\"我就是一个测试78789798798\"); } }");
    return builder.toString();
}

2.有了代码我们就需要编译代码,这里有2种方式,(1)写出文件,从文件编译;(2)直接在内存编译,我们拼接的class本来就在内存,没必要写出再加载浪费时间和空间,所以直接从内存编译

1)JavaCompiler编译时需要一个JavaFileObject和一个StandardJavaFileManager,系统的JavaFileObject都是针对文件的,这里我们先自定义一个针对Str的JavaFileObject

/**
 * 描述:
 * 自定义String字符串对象文件处理
 *
 * @author XiangQingSong
 * @create 2020-01-08-15:32
 */
public class StrSrcJavaObject extends SimpleJavaFileObject{
    /**str拼接的类*/
    private String content;
    /**类名*/
    private String name;
    /**编译后的文件内容*/
    private final Map<String, byte[]> clam = new HashMap<String, byte[]>();
    /**
     *
     */
    public StrSrcJavaObject(String name, String count) {
        super(URI.create("string:///" + name.replace(".", "/") + Kind.SOURCE.extension), Kind.SOURCE);
        this.content = count;
        this.name = name;
    }
    @Override
    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
        System.out.println("获取拼接类" + content);
        return content;
    }

    @Override
    public OutputStream openOutputStream() throws IOException {
        System.out.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值