• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Java ClassWriter类代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了Java中com.sun.tools.classfile.ClassWriter的典型用法代码示例。如果您正苦于以下问题:Java ClassWriter类的具体用法?Java ClassWriter怎么用?Java ClassWriter使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。



ClassWriter类属于com.sun.tools.classfile包,在下文中一共展示了ClassWriter类的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Java代码示例。

示例1: main

import com.sun.tools.classfile.ClassWriter; //导入依赖的package包/类
public static void main(String... args) throws Exception {
    new File("d1").mkdir();
    new File("d2").mkdir();

    // Step 1. build an empty class with an interface
    makeClass("d1", "Empty.java", "abstract class Empty implements Readable {}");

    // Step 2. Modify classfile to have invalid constant pool index
    ClassFile cf = ClassFile.read(new File("d1","Empty.class"));
    cf.interfaces[0] = cf.constant_pool.size() + 10;
    ClassWriter cw = new ClassWriter();
    cw.write(cf, new File("d2","Empty.class"));

    // Step 3. Compile use of invalid class
    String result = makeClass("d2", "EmptyUse.java", "class EmptyUse { Empty e; }");
    if (!result.contains("compiler.misc.bad.class.file")) {
        System.out.println(result);
        throw new Exception("test failed");
    }
}
 
开发者ID:AdoptOpenJDK,项目名称:openjdk-jdk10,代码行数:21,代码来源:BadClass.java


示例2: testNoNameClass

import com.sun.tools.classfile.ClassWriter; //导入依赖的package包/类
/**
 * Test an invalid class, with this_class == 0.
 */
@Test
public void testNoNameClass(Path base) throws Exception {
    Path src = base.resolve("src");
    Path classes = Files.createDirectories(base.resolve("classes"));
    tb.writeJavaFiles(src, "class A { }");

    new JavacTask(tb)
            .outdir(classes.toString())
            .files(tb.findJavaFiles(src))
            .run()
            .writeAll();

    ClassFile cf = ClassFile.read(classes.resolve("A.class"));
    ClassFile cf2 = new ClassFile(
            cf.magic, cf.minor_version, cf.major_version, cf.constant_pool,
            cf.access_flags,
            0, // this_class,
            cf.super_class, cf.interfaces, cf.fields, cf.methods, cf.attributes);
    new ClassWriter().write(cf2, Files.newOutputStream(classes.resolve("Z.class")));

    List<String> log = new JavapTask(tb)
            .classpath(classes.toString())
            .classes("Z")
            .run()
            .writeAll()
            .getOutputLines(Task.OutputKind.DIRECT);

    checkOutput(log, true, "Warning:.*Z.class does not contain class Z");
}
 
开发者ID:AdoptOpenJDK,项目名称:openjdk-jdk10,代码行数:33,代码来源:TestClassNameWarning.java


示例3: addModuleResolutionAttribute

import com.sun.tools.classfile.ClassWriter; //导入依赖的package包/类
private void addModuleResolutionAttribute(Path classfile, int resolution_flags) throws Exception {
    ClassFile cf = ClassFile.read(classfile);
    Attributes attrs = cf.attributes;
    List<CPInfo> cpData = new ArrayList<>();
    cpData.add(null);
    for (CPInfo info : cf.constant_pool.entries()) {
        cpData.add(info);
        if (info.size() == 2)
            cpData.add(null);
    }
    cpData.add(new CONSTANT_Utf8_info(Attribute.ModuleResolution));
    ConstantPool newCP = new ConstantPool(cpData.toArray(new CPInfo[0]));
    ModuleResolution_attribute res = new ModuleResolution_attribute(newCP, resolution_flags);
    Map<String, Attribute> newAttributeMap = new HashMap<>(attrs.map);
    newAttributeMap.put(Attribute.ModuleResolution, res);
    Attributes newAttrs = new Attributes(newAttributeMap);
    ClassFile newCF = new ClassFile(cf.magic,
                                    cf.minor_version,
                                    cf.major_version,
                                    newCP,
                                    cf.access_flags,
                                    cf.this_class,
                                    cf.super_class,
                                    cf.interfaces,
                                    cf.fields,
                                    cf.methods,
                                    newAttrs);
    try (OutputStream out = Files.newOutputStream(classfile)) {
        new ClassWriter().write(newCF, out);
    }
}
 
开发者ID:AdoptOpenJDK,项目名称:openjdk-jdk10,代码行数:32,代码来源:IncubatingTest.java


示例4: testNonZeroOpensInOpen

import com.sun.tools.classfile.ClassWriter; //导入依赖的package包/类
@Test
public void testNonZeroOpensInOpen(Path base) throws Exception {
    Path m1 = base.resolve("m1x");
    tb.writeJavaFiles(m1,
                      "module m1x { opens api; }",
                      "package api; public class Api {}");
    Path classes = base.resolve("classes");
    Path m1Classes = classes.resolve("m1x");
    tb.createDirectories(m1Classes);

    new JavacTask(tb)
        .options("-XDrawDiagnostics")
        .outdir(m1Classes)
        .files(findJavaFiles(m1))
        .run(Expect.SUCCESS)
        .writeAll();

    Path miClass = m1Classes.resolve("module-info.class");
    ClassFile cf = ClassFile.read(miClass);
    Module_attribute module = (Module_attribute) cf.attributes.map.get(Attribute.Module);
    Module_attribute newModule = new Module_attribute(module.attribute_name_index,
                                                      module.module_name,
                                                      module.module_flags | Module_attribute.ACC_OPEN,
                                                      module.module_version_index,
                                                      module.requires,
                                                      module.exports,
                                                      module.opens,
                                                      module.uses_index,
                                                      module.provides);
    Map<String, Attribute> attrs = new HashMap<>(cf.attributes.map);

    attrs.put(Attribute.Module, newModule);

    Attributes newAttributes = new Attributes(attrs);
    ClassFile newClassFile = new ClassFile(cf.magic,
                                           cf.minor_version,
                                           cf.major_version,
                                           cf.constant_pool,
                                           cf.access_flags,
                                           cf.this_class,
                                           cf.super_class,
                                           cf.interfaces,
                                           cf.fields,
                                           cf.methods,
                                           newAttributes);

    try (OutputStream out = Files.newOutputStream(miClass)) {
        new ClassWriter().write(newClassFile, out);
    }

    Path test = base.resolve("test");
    tb.writeJavaFiles(test,
                      "package impl; public class Impl extends api.Api {}");
    Path testClasses = base.resolve("test-classes");
    tb.createDirectories(testClasses);

    List<String> log = new JavacTask(tb)
            .options("-XDrawDiagnostics",
                     "--module-path", classes.toString(),
                     "--add-modules", "m1x")
            .outdir(testClasses)
            .files(findJavaFiles(test))
            .run(Expect.FAIL)
            .writeAll()
            .getOutputLines(Task.OutputKind.DIRECT);

    List<String> expected = Arrays.asList(
            "- compiler.err.cant.access: m1x.module-info, "
                    + "(compiler.misc.bad.class.file.header: module-info.class, "
                    + "(compiler.misc.module.non.zero.opens: m1x))",
                                          "1 error");

    if (!expected.equals(log))
        throw new Exception("expected output not found: " + log);
}
 
开发者ID:AdoptOpenJDK,项目名称:openjdk-jdk10,代码行数:76,代码来源:OpenModulesTest.java


示例5: main

import com.sun.tools.classfile.ClassWriter; //导入依赖的package包/类
public static void main(String[] args) throws Exception {
    if (args.length < 2) {
        System.err.println("Usage: java RemoveMethods classfile output [method...]");
        System.exit(-1);
    }

    // class file to read
    Path input = Paths.get(args[0]);

    // class file to write, if directory then use the name of the input
    Path output = Paths.get(args[1]);
    if (Files.isDirectory(output))
        output = output.resolve(input.getFileName());

    // the methods to remove
    Set<String> methodsToRemove = new HashSet<>();
    int i = 2;
    while (i < args.length)
        methodsToRemove.add(args[i++]);

    // read class file
    ClassFile cf;
    try (InputStream in = Files.newInputStream(input)) {
         cf = ClassFile.read(in);
    }

    final int magic = cf.magic;
    final int major_version = cf.major_version;
    final int minor_version = cf.minor_version;
    final ConstantPool cp = cf.constant_pool;
    final AccessFlags access_flags = cf.access_flags;
    final int this_class = cf.this_class;
    final int super_class = cf.super_class;
    final int[] interfaces = cf.interfaces;
    final Field[] fields = cf.fields;
    final Attributes class_attrs = cf.attributes;

    // remove the requested methods, no signature check at this time
    Method[] methods = cf.methods;
    i = 0;
    while (i < methods.length) {
        Method m = methods[i];
        String name = m.getName(cp);
        if (methodsToRemove.contains(name)) {
            int len = methods.length;
            Method[] newMethods = new Method[len-1];
            if (i > 0)
                System.arraycopy(methods, 0, newMethods, 0, i);
            int after = methods.length - i - 1;
            if (after > 0)
                System.arraycopy(methods, i+1, newMethods, i, after);
            methods = newMethods;
            String paramTypes = m.descriptor.getParameterTypes(cp);
            System.out.format("Removed method %s%s from %s%n",
                name, paramTypes, cf.getName());
            continue;
        }
        i++;
    }

    // TBD, prune constant pool of entries that are no longer referenced

    // re-write class file
    cf = new ClassFile(magic, minor_version, major_version, cp, access_flags,
            this_class, super_class, interfaces, fields, methods, class_attrs);
    try (OutputStream out = Files.newOutputStream(output)) {
         new ClassWriter().write(cf, out);
    }
}
 
开发者ID:JetBrains,项目名称:jdk8u_jdk,代码行数:70,代码来源:RemoveMethods.java



注:本文中的com.sun.tools.classfile.ClassWriter类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Java FloatPolygon类代码示例发布时间:2022-05-22
下一篇:
Java BlockDirt类代码示例发布时间:2022-05-22
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap