Javassist之常用API的应用 02

测试模型代码:

 1 package org.study2.JavaSenior.annotation.javassistDemo;
 2
 3 /**
 4  * @Auther:GongXingRui
 5  * @Date:2018/10/30
 6  * @Description:
 7  **/
 8
 9 @Author(name = "gxr", year = 2018)
10 public class Emp {
11
12     private int empno;
13     private String ename;
14
15     public void sayHello(int a) {
16         System.out.println("sayHello," + a);
17     }
18
19     public int getEmpno() {
20         return empno;
21     }
22
23     public void setEmpno(int empno) {
24         this.empno = empno;
25     }
26
27     public String getEname() {
28         return ename;
29     }
30
31     public void setEname(String ename) {
32         this.ename = ename;
33     }
34
35     public Emp(int empno, String ename) {
36         super();
37         this.empno = empno;
38         this.ename = ename;
39     }
40
41     public Emp() {
42     }
43 }

API应用代码:

  1 package org.study2.JavaSenior.annotation.javassistDemo;
  2
  3 import javassist.*;
  4
  5 import java.lang.reflect.Method;
  6 import java.util.Arrays;
  7
  8 /**
  9  * @Auther:GongXingRui
 10  * @Date:2018/10/30
 11  * @Description: Javassist 常用API的应用
 12  **/
 13 public class JavassistDemo2 {
 14     /**
 15      * 处理类的基本用法
 16      *
 17      * @throws Exception
 18      */
 19     public static void test01() throws Exception {
 20         ClassPool pool = ClassPool.getDefault();
 21         CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
 22
 23         byte[] bytes = cc.toBytecode();
 24         System.out.println(Arrays.toString(bytes));
 25
 26         System.out.println(cc.getName()); //获取类名
 27         System.out.println(cc.getSimpleName()); //获取简要类名
 28         System.out.println(cc.getSuperclass()); //获得父类
 29         System.out.println(cc.getInterfaces()); //获得接口
 30
 31     }
 32
 33     /**
 34      * 测试产生新的方法
 35      *
 36      * @throws Exception
 37      */
 38     public static void test02() throws Exception {
 39         ClassPool pool = ClassPool.getDefault();
 40         CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
 41
 42         // CtMethod m = CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
 43
 44         CtMethod m = new CtMethod(CtClass.intType, "add",
 45                 new CtClass[]{CtClass.intType, CtClass.intType}, cc);
 46         m.setModifiers(Modifier.PUBLIC);
 47         m.setBody("{System.out.println(\"www.sxt.cn\");return $1+$2;}");
 48
 49         cc.addMethod(m);
 50
 51         //通过反射调用新生成的方法
 52         Class clazz = cc.toClass();
 53         Object obj = clazz.newInstance();  //通过调用Emp无参构造器,创建新的Emp对象
 54         Method method = clazz.getDeclaredMethod("add", int.class, int.class);
 55         Object result = method.invoke(obj, 200, 300);
 56         System.out.println(result);
 57     }
 58
 59     /**
 60      * 修改已有的方法的信息,修改方法体的内容
 61      *
 62      * @throws Exception
 63      */
 64     public static void test03() throws Exception {
 65         ClassPool pool = ClassPool.getDefault();
 66         CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
 67
 68         CtMethod cm = cc.getDeclaredMethod("sayHello", new CtClass[]{CtClass.intType});
 69         cm.insertBefore("System.out.println($1);System.out.println(\"start!!!\");");
 70         cm.insertAt(9, "int b=3;System.out.println(\"b=\"+b);");
 71         cm.insertAfter("System.out.println(\"end!!!\");");
 72
 73         //通过反射调用新生成的方法
 74         Class clazz = cc.toClass();
 75         Object obj = clazz.newInstance();  //通过调用Emp无参构造器,创建新的Emp对象
 76         Method method = clazz.getDeclaredMethod("sayHello", int.class);
 77         method.invoke(obj, 300);
 78     }
 79
 80     /**
 81      * 属性的操作
 82      *
 83      * @throws Exception
 84      */
 85     public static void test04() throws Exception {
 86         ClassPool pool = ClassPool.getDefault();
 87         CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
 88
 89         //  CtField f1 = CtField.make("private int empno;", cc);
 90         CtField f1 = new CtField(CtClass.intType, "salary", cc);
 91         f1.setModifiers(Modifier.PRIVATE);
 92         cc.addField(f1);
 93
 94         //  cc.getDeclaredField("ename");   //获取指定的属性
 95
 96         //增加相应的set和get方法
 97         cc.addMethod(CtNewMethod.getter("getSalary", f1));
 98         cc.addMethod(CtNewMethod.setter("setSalary", f1));
 99
100         Class clazz = cc.toClass();
101         Object obj = clazz.newInstance();
102         Method method = clazz.getDeclaredMethod("setSalary", int.class);
103         method.invoke(obj, 2000);
104         Method method2 = clazz.getDeclaredMethod("getSalary", null);
105         int n = (int) method2.invoke(obj, null);
106         System.out.println("Salary=" + n);
107
108     }
109
110     /**
111      * 构造方法的操作
112      *
113      * @throws Exception
114      */
115     public static void test05() throws Exception {
116         ClassPool pool = ClassPool.getDefault();
117         CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
118
119         CtConstructor[] cs = cc.getConstructors();
120         for (CtConstructor c : cs) {
121             System.out.println(c.getLongName());
122         }
123     }
124
125
126     public static void test06() throws Exception {
127         CtClass cc = ClassPool.getDefault().get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
128         Object[] all = cc.getAnnotations();
129         Author a = (Author) all[0];
130         String name = a.name();
131         int year = a.year();
132         System.out.println("name: " + name + ", year: " + year);
133
134     }
135
136
137     public static void main(String[] args) throws Exception {
138         test06();
139     }
140 }

原文地址:https://www.cnblogs.com/gongxr/p/9882060.html

时间: 2024-08-30 16:50:52

Javassist之常用API的应用 02的相关文章

hadoop java接口及常用api

# java接口及常用api package com.yting.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputS

二维数组(扩展hash数组)以及json,严格模式,字符串的常用api

二维数组 数组中的每一个元素也是数组 ?var arr=[ [1,2,3], [4,5,6], [7,8,9], [1,2,3,4,5,6,7] ...]; 怎么遍历二维数组 var arr=[ [1,2,3], [4,5,6,7], [10,20,30,40,60,80] ]; for(var r=0;r<arr.length;r++){ for(var c=0;c<arr[r].length;c++){ console.log(arr[r][c]); } } 怎么访问二维数组中的元素 ar

C++ 中超类化和子类化常用API

在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWindowLong,CallWindowProc,FindWindowEx 超类化:GetClassInfoEx,RegisterClassEx,UnRegisterClass 以上函数在代码中的使用见<C++ 中超类化和子类化> VC中基于SDK编程的窗口子类化 VC中基于SDK编程的窗口子类化的

List容器——ArrayList及常用API

List: ①   List容器是有序的collection(也称为序列).此接口的用户可以对List容器中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素.List容器允许插入重复的值,包括null; ②   最常见的两个List接口的实现类是ArrayList和LinkedList; ArrayList及常用API: ①   ArrayList—动态数组; ②   ArrayList类扩展了AbstractList并实现了List接口

hadoop常用api编写

package hsfs常用api; import java.io.ByteArrayInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration;

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

STL vector常用API

1.容器:序列容器(时间决定).关联式容器(容器中的数据有一定规则) 2.迭代器:通过迭代器寻找.遍历容器中的数据 vetor的使用:数据遍历与输出 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> //向量 动态数组 #include<algorithm> //算法头文件 #include<string> using namespace std; void myPrint

Javascript操作DOM常用API总结

Javascript操作DOM常用API总结 原文地址:http://luopq.com/2015/11/30/javascript-dom/ 类型 Node类型(ELEMENT_NODE:1 ATTRIBUTE_NODE:2 TEXT_NODE:3 COMMENT_NODE:8``DOCUMENT_NODE:9 DOCUMENT_FRAGMENT_NODE:11) 节点创建型(createElement createTextNode cloneNode createDocumentFragme

Collection类及常用API

Collection类及常用API Collection—类集工具类,定义了若干用于类集和映射的算法,这些算法被定义为静态方法,具体查看api文档; a)  public static void sort(List<T> liet) b)  public static int binarySearch(List<T> list,T key) c)  public static void reverse(List<?> list) d)  public static vo