Java:使⽤javassist读取class⽂件并获得其中的内容信息
1. 声明
当前内容主要为本⼈学习和复习使⽤javassit操作读取class⽂件并获取其中的信息,这个信息主要包括,注解声明,⽅法,接⼝,java编译器版本
主要操作:
1. 主要使⽤ClassFile⽅式读取class⽂件的信息
2. demo
⾸先准备⼀个接⼝,和⼀个实现类
public interface ByteCodeResolver {
ClassFileInfo resolver(byte[] bytes);
初三班主任寄语
}
实现类
@Deprecated
public class DefaultByteCodeResolver implements ByteCodeResolver{
//
@Override
public ClassFileInfo resolver(byte[] bytes){
// TODO Auto-generated method stub
return null;
}
}
解析的demo
热火朝天造句
import DataInputStream;
import File;
import FileInputStream;
import IOException;
import Arrays;
import List;
import Set;
import AnnotationsAttribute;
字字珠玑什么意思
import AttributeInfo;
import ClassFile;
import ConstPool;
import DeprecatedAttribute;
import MethodInfo;
import SourceFileAttribute;
import Annotation;
/**
*
* @author hy
带虎的四字词语* @createTime 2021-07-17 13:42:58
* @description 当前内容主要为使⽤javaassit的ClassFile来获取当前的⽂件信息
*
*/
public class JavaassitClassFileTest {
public static void main(String[] args){
String classFilePath ="D:\\eclip-workspace\\Java8BasicReStudy\\target\\class\\com\\hy\\java\\bytecode\\DefaultByteCodeResolver.class";
try(DataInputStream dis =new DataInputStream(new FileInputStream(new File(classFilePath)))){
泡腾片ClassFile classFile =new ClassFile(dis);
int minorVersion = MajorVersion();
int minorVersion = MajorVersion();
System.out.println("获取当前的class⽂件的jdk编译版本信息:"+ minorVersion);
String[] interfaces = Interfaces();离别的思念
System.out.println("当前classFile中的所有的接⼝名称为:"+ String(interfaces));
System.out.println("开始输出常量池中的内容:");
ConstPool constPool = ConstPool();
Set<String> classNames = ClassNames();
System.out.println("classNames="+ classNames);
boolean isInterface = classFile.isInterface();
System.out.println("当前的这个类是否为接⼝?"+ isInterface);
// 获取这个类上⾯的注解属性
List<AttributeInfo> attributes = Attributes();
if(attributes ==null|| attributes.isEmpty()){
System.out.println("没有任何的属性!");
}
for(AttributeInfo attributeInfo : attributes){
// 获取注解属性
if(attributeInfo instanceof AnnotationsAttribute){
AnnotationsAttribute attr =(AnnotationsAttribute) attributeInfo;
Annotation[] annotations = Annotations();
System.out.println("解析获得注解:"+ String(annotations));
}el if(attributeInfo instanceof DeprecatedAttribute){
// 获取DeprecatedAttribute属性
DeprecatedAttribute attr =(DeprecatedAttribute) attributeInfo;
System.out.println("attr="+ attr.tag);
}el if(attributeInfo instanceof SourceFileAttribute){
// 获取源⽂件属性
SourceFileAttribute attr =(SourceFileAttribute) attributeInfo;
String fileName = FileName();
System.out.println("fileName="+ fileName);
}
}
// 由于获取了注解所以可以使⽤各种其他的操作
// 获取当前的⽅法
System.out.println("输出当前的所有的⽅法:");
List<MethodInfo> methods = Methods();
if(methods==null||methods.isEmpty()){
System.out.println("没有任何⽅法.....");
睡不着的图片}el{
for(MethodInfo methodInfo : methods){
System.out.Name()+","+Descriptor());
}
}
}catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
陈涉世家主旨执⾏结果如下:
3. 总结
1. 注解属性存在于Attributes中,有⼀个AnnotationsAttribute
2. 直接通过getInterface⽅法可以获取到当前类实现的接⼝
3. 通过getMethods⽅法可以获取所有的⽅法,但是这些获取到的⽅法的Descriptor为(⽅法参数类型)返回值类型,其中V表⽰void⽅法,其他的表⽰其他类型的[B表⽰byte数组