一、复现步骤

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. 基础篇:深入解析JAVA异常

    目录 1 异常的分类和继承关系 2 几种常见异常类的解析 3 Java异常关键字 4 开发过程处理异常注意点 5 异常和AutoCloseable(1.7-JDK的语法糖) 6 throw和throw ...

  2. springboot项目根据不同的环境启动不同的配置,如开发环境dev,测试环境sit,生产环境application

    在项目开发中,会有多个环境,如在开发环境开发完,然后在测试环境测试,最后到生产环境,每个环境的配置是不一样的,如数据库配置:还好spring提供了一个管理配置的方式:

  3. Layman ThinkPHP 中 where条件 or,and 同时使用

    Eg:('a'=1 and 'b'=2) or ('c'=3 and 'd'=4) and 'e'=5 解决方法 $condition1['a'] = 1; $condition1['b'] = 2; ...

  4. 【题解】Computer Network

    Description 给你一棵N(N<=10000)个节点的树,求每个点到其他点的最大距离. Input 第一行一个数N.接下来若干行每行两个数k,t描述一条点k到点t的边(输入数据保证无重复 ...

  5. Java 读取文件中的每一行,并为每一行插入特定的字符串

    工具 1:Eclipse Java EE IDE for Web Developers. Version: Photon Release (4.8.0). Build id: 20180619-120 ...

  6. Jetson AGX Xavier/ubuntu查找文件

    用以下命令查找文件 sudo updatedb locate xxx #xxx是文件名 如果找不到命令,则需要安装mlocate sudo apt-get install mlocate

  7. Java之线程池解析

    线程池 目录 线程池 线程池概述 创建一个线程池并提交线程任务 线程池源码解析 参数认识 构造方法 提交任务 addWorker 执行任务 关闭线程池 线程池概述 什么是线程池 为什么使用线程池 线程 ...

  8. php-fpm 的各种启动方式

    启动 php-fpm 最简单的操作: /usr/local/php/sbin/php-fpm php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/ph ...

  9. 多测师讲解接口测试_F12中network里headers各项属性的含义——高级讲师肖sir

    General部分: Request URL:资源的请求url # Request Method:HTTP方法  Status Code:响应状态码  200(状态码) OK 301 - 资源(网页等 ...

  10. 【不知道怎么分类】CF 819B Mister B and PR Shifts

    题目内容 洛谷链接 定义一个全排列\(p_i\)的偏移值为\(\sum_{i=1}^{n}|p[i]-i|\). 给你一个全排列,你可以从后面拿\(k\in[0,n-1]\)个数放在前面,使得该全排列 ...