一、复现步骤

1)编写待编译的java类

package f_asm_and_javassist;

import jdk.internal.org.objectweb.asm.*;

import java.io.*;

import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;

/**
* @Author zhangboqing
* @Date 2020/3/26
*/
public class AsmDemo { //访问类的方法和字段
public static void main(String[] args) {
byte[] bytes = getBytes(); // MyMain.class 文件的字节数组
ClassReader cr = new ClassReader(bytes);
ClassWriter cw = new ClassWriter(0);
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
@Override
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
System.out.println("field: " + name);
return super.visitField(access, name, desc, signature, value);
} @Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
System.out.println("method: " + name);
return super.visitMethod(access, name, desc, signature, exceptions);
}
};
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
} private static byte[] getBytes() { StringBuilder sb = new StringBuilder();
try(FileInputStream fileInputStream = new FileInputStream(new File("MyMain.class"));
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) { byte[] buffer = new byte[1024*8];
while (bufferedInputStream.available() > 0) { int length = bufferedInputStream.read(buffer);
sb.append(new String(buffer,0,length) );
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return sb.toString().getBytes();
}
}

2)在当前目录使用javac编译

 javac -d . AsmDemo.java

提示如下错误:

➜  f_asm_and_javassist git:(master) ✗ javac -d . AsmDemo.java
AsmDemo.java:3: error: package jdk.internal.org.objectweb.asm does not exist
import jdk.internal.org.objectweb.asm.*;
^
AsmDemo.java:7: error: package jdk.internal.org.objectweb.asm does not exist
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
^
AsmDemo.java:7: error: static import only from classes and interfaces
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
^
AsmDemo.java:18: error: cannot find symbol
ClassReader cr = new ClassReader(bytes);
^
symbol: class ClassReader
location: class AsmDemo
AsmDemo.java:18: error: cannot find symbol
ClassReader cr = new ClassReader(bytes);
^
symbol: class ClassReader
location: class AsmDemo
AsmDemo.java:19: error: cannot find symbol
ClassWriter cw = new ClassWriter(0);
^
symbol: class ClassWriter
location: class AsmDemo
AsmDemo.java:19: error: cannot find symbol
ClassWriter cw = new ClassWriter(0);
^
symbol: class ClassWriter
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: class ClassVisitor
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: class ClassVisitor
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: variable ASM5
location: class AsmDemo
AsmDemo.java:33: error: cannot find symbol
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
^
symbol: variable ClassReader
location: class AsmDemo
AsmDemo.java:33: error: cannot find symbol
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
^
symbol: variable ClassReader
location: class AsmDemo
12 errors

二、解决办法

这就是javac的限制。默认情况下,javac不会从rt.jar中读取类。它从一个符号文件中读取,该文件只包含标准API和一些内部API(例如com.sun.,com.oracle.和sun . *)。

要禁用此机制,可以使用 javac -XDignore.symbol.file=true

使用maven可以用:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-XDignore.symbol.file</compilerArgument>
</configuration>
</plugin>

上述问题采用下面命令执行就可以成功了:

 javac -XDignore.symbol.file=true -d . AsmDemo.java

待包名的类,需要使用 -d .,表示在当前目录自动生成包路径

【Javac编译异常】javac编译提示jdk中的包找不到的问题error: package jdk.internal.org.objectweb.asm does not exist 和 error: cannot find symbol的更多相关文章

  1. JDK中Concurrent包介绍及使用(包含atomic包/lock包/并发容器/执行器)

    Java Concurrent并发包概括  https://blog.csdn.net/u012232736/article/details/79919450 Java中的Atomic包使用指南   ...

  2. JDK中主要包的介绍

    java.lang——包含一些Java语言的核心类,如String.Math.Integer.System和Thread,提供常用功能.java.net——包含执行与网络相关的操作的类和接口.java ...

  3. IDEA不自动提示仓库中有的包maven

  4. linux中管理包的apt和dpkg命令用法

    1,apt-get命令 apt-get是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸 ...

  5. Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决

    今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...

  6. javac 编译与 JIT 编译

    编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...

  7. Javac编译和JIT编译

    编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...

  8. Javac编译与JIT编译

    本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的 ...

  9. 【深入Java虚拟机】之七:Javac编译与JIT编译

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...

随机推荐

  1. 微信小程序 A~Z城市选择器js文件

    微信小程序城市选择 [a~z] 的所有城市选择 city.js a~z排序的城市数据 addressChoose.js 其他js文件可引用 city.js /** * Created by yvded ...

  2. mysql 空值(null)和空字符('')的区别

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符(")和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度 ...

  3. Centos-文本过滤-grep

    grep 文本过滤,对文本的每一行进行关键字搜索,如果找到则输出 相关选项 -A 除了列出符合关键字的行外,还输出符合关键字行后多少行内容 -c 只显示符号条件的行号 -f  批量搜索,把关键字写入到 ...

  4. PCA基本原理

    降维问题的优化目标:将一组N维向量降维k维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后, 选择然数据点之间方差最大的方向作为坐标轴 各字段两两间协方差为0, ...

  5. Java知识系统回顾整理01基础04操作符07Scanner

    一.Scanner 需要用到从控制台输入数据时,使用Scanner类. 二.使用Scanner读取整数 注意: 使用Scanner类,需要在最前面加上 import java.util.Scanner ...

  6. Springboot应用使用Docker部署

    首先准备好springboot应用,然后打包,我这里已经准备好了一个jar包 然后上传到服务器,准备一个目录用于存放jar包和Dokerfile文件 编写Dokerfile文件 我这里写的很简单,就简 ...

  7. TP5 调用快递鸟api 查询快递信息

    1,去快递鸟,下载sdk https://www.kdniao.com/api-track 下载PHPsdk 2,下载下来的事PHP文件,不是以类的形式显示的,所以为了方便,我把他封装成了类,不需要封 ...

  8. C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法

    翻译自 John Demetriou 2019年2月17日 的文章 <C# 8 – Introducing Index Struct And A Brand New Usage For The ...

  9. Oracle体系结构概述与SQL解析剖析

    Oracle服务器 是一个数据库管理系统,它提供了一种全面.开放.集成的方法来管理信息. Oracle服务器由Oracle数据库和Oracle实例组成. oracle数据库软件和Oracle数据库软件 ...

  10. matplotlib画图教程,设置坐标轴标签和间距

    大家好,欢迎来到周四数据处理专题,我们今天继续matplotlib作图教程. 在上周的文章当中我们介绍了如何通过xlabel和ylabel设置坐标轴的名称,以及这两个函数的花式设置方法,可以设置出各种 ...