新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
javajavassist庫處理類的基本用法
public class Dema {
//獲取原方法信息
public static void test01() throws Exception
{
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp"); //獲得已有的類
byte[] bytes=cc.toBytecode(); //轉(zhuǎn)換成字節(jié)碼
System.out.println(cc.getName()); //獲取類名
System.out.println(cc.getSimpleName()); //獲取簡要類名
System.out.println(cc.getSuperclass()); //獲取父類
System.out.println(Arrays.toString(bytes));
System.out.println(cc.getInterfaces()); //獲取接口,返回的是數(shù)組
}
//添加方法
public static void test02() throws Exception
{
ClassPool pool =ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp");
//創(chuàng)建新方法
CtMethod m=CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
//創(chuàng)建新方法
CtMethod m2=new CtMethod(CtClass.intType,"add2",new CtClass[] {CtClass.intType,CtClass.intType},cc);
m2.setModifiers(Modifier.PUBLIC); //設(shè)置權(quán)限
m2.setBody("{System.out.println(\"yes\");return $1+$2;}"); //占位符代替形參名
cc.addMethod(m2);
cc.addMethod(m);
//通過反射調(diào)用新生成的方法
Class clazz=cc.toClass();
Object obj=clazz.newInstance(); //通過調(diào)用Emp的無參構(gòu)造器,創(chuàng)建新的Emp對象
Method method=clazz.getDeclaredMethod("add2",int.class,int.class);
Object result=method.invoke(obj, 200,300);
System.out.println(result);
}
//修改方法
public static void test03() throws Exception
{
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp");
CtMethod cm=cc.getDeclaredMethod("sayHello",new CtClass[] {CtClass.intType});
//在方法開頭添加內(nèi)容
cm.insertBefore("System.out.println($1);System.out.println(\"start\");");
//在某一行前面加代碼
cm.insertAt(8, "System.out.println(\"ugly\");");
//在方法后面加內(nèi)容
cm.insertAfter("System.out.println(\"end\");");
Class clazz=cc.toClass();
Object obj=clazz.newInstance(); //通過調(diào)用Emp的無參構(gòu)造器,創(chuàng)建新的Emp對象
Method method=clazz.getDeclaredMethod("sayHello",int.class);
method.invoke(obj,300);
}
//修改屬性
public static void test04() throws Exception
{
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp");
CtField f1=CtField.make("private int emm;", cc);
CtField f2=new CtField(CtClass.intType,"emm2",cc);
f2.setModifiers(Modifier.PRIVATE);
cc.addField(f1,"100"); //傳默認值
cc.addField(f2);
//cc.getDeclaredField("ename"); 獲取指定屬性
//增加相應(yīng)的set和get方法
cc.addMethod(CtNewMethod.getter("getEmm2", f2));
cc.addMethod(CtNewMethod.getter("setEmm2", f2));
}
//構(gòu)造器
public static void test05() throws Exception
{
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp");
CtConstructor[] cs= cc.getConstructors();
for(CtConstructor c:cs)
{
System.out.println(c.getLongName());
}
}
//調(diào)用注解
public static void test06() throws Exception
{
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("cn.sxt.in.Emp");
Object[] all=cc.getAnnotations();
Author a=(Author)all[0];
String name=a.name();
int year=a.year();
System.out.println("name:"+name+",year:"+year);
}
public static void main(String[] args) throws Exception {
test06();
}
}
新聞標題:javajavassist庫處理類的基本用法
當(dāng)前鏈接:http://ef60e0e.cn/article/gegije.html