Javassist读取类信息非常简单,使用ClassPool对象获取到CtClass对象后就可以像使用Java反射API一样去读取类信息了。
Javassist读取类信息示例代码:
package com.anbai.sec.bytecode.javassist;import javassist.*;import java.util.Arrays;public class JavassistClassAccessTest {public static void main(String[] args) {// 创建ClassPool对象ClassPool classPool = ClassPool.getDefault();try {CtClass ctClass = classPool.get("com.anbai.sec.bytecode.TestHelloWorld");System.out.println("解析类名:" + ctClass.getName() + ",父类:" + ctClass.getSuperclass().getName() +",实现接口:" + Arrays.toString(ctClass.getInterfaces()));System.out.println("-----------------------------------------------------------------------------");// 获取所有的构造方法CtConstructor[] ctConstructors = ctClass.getDeclaredConstructors();// 获取所有的成员变量CtField[] ctFields = ctClass.getDeclaredFields();// 获取所有的成员方法CtMethod[] ctMethods = ctClass.getDeclaredMethods();// 输出所有的构造方法for (CtConstructor ctConstructor : ctConstructors) {System.out.println(ctConstructor.getMethodInfo());}System.out.println("-----------------------------------------------------------------------------");// 输出所有成员变量for (CtField ctField : ctFields) {System.out.println(ctField);}System.out.println("-----------------------------------------------------------------------------");// 输出所有的成员方法for (CtMethod ctMethod : ctMethods) {System.out.println(ctMethod);}} catch (NotFoundException e) {e.printStackTrace();}}}
程序执行结果:
解析类名:com.anbai.sec.bytecode.TestHelloWorld,父类:java.lang.Object,实现接口:[javassist.CtClassType@60addb54[public abstract interface class java.io.Serializable fields= constructors= methods=]]-----------------------------------------------------------------------------<init> ()V-----------------------------------------------------------------------------com.anbai.sec.bytecode.TestHelloWorld.serialVersionUID:Jcom.anbai.sec.bytecode.TestHelloWorld.id:Jcom.anbai.sec.bytecode.TestHelloWorld.username:Ljava/lang/String;com.anbai.sec.bytecode.TestHelloWorld.password:Ljava/lang/String;-----------------------------------------------------------------------------javassist.CtMethod@ca717109[public hello (Ljava/lang/String;)Ljava/lang/String;]javassist.CtMethod@44a4fe33[public static main ([Ljava/lang/String;)V]javassist.CtMethod@fb809fd2[public getId ()J]javassist.CtMethod@5321790a[public setId (J)V]javassist.CtMethod@7a2b684d[public getUsername ()Ljava/lang/String;]javassist.CtMethod@7942008f[public setUsername (Ljava/lang/String;)V]javassist.CtMethod@3b463cd2[public getPassword ()Ljava/lang/String;]javassist.CtMethod@da549dd4[public setPassword (Ljava/lang/String;)V]javassist.CtMethod@69cb6c6d[public toString ()Ljava/lang/String;]
