posts - 25,comments - 0,trackbacks - 0
          <2012年3月>
          26272829123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Class search path

          The default ClassPool returned by a static method ClassPool.getDefault() searches the same path that the underlying JVM (Java virtual machine) has. If a program is running on a web application server such as JBoss and Tomcat, the ClassPool object may not be able to find user classes since such a web application server uses multiple class loaders as well as the system class loader. In that case, an additional class path must be registered to the ClassPool. Suppose that pool refers to aClassPool object:

            pool.insertClassPath(new ClassClassPath(this.getClass())); 

          This statement registers the class path that was used for loading the class of the object that this refers to. You can use any Class object as an argument instead ofthis.getClass(). The class path used for loading the class represented by that Class object is registered.

          You can register a directory name as the class search path. For example, the following code adds a directory /usr/local/javalib to the search path:

            ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("/usr/local/javalib"); 

          The search path that the users can add is not only a directory but also a URL:

            ClassPool pool = ClassPool.getDefault(); ClassPath cp = new URLClassPath("www.javassist.org", 80, "/java/", "org.javassist."); pool.insertClassPath(cp); 

          This program adds "http://www.javassist.org:80/java/" to the class search path. This URL is used only for searching classes belonging to a package org.javassist. For example, to load a class org.javassist.test.Main, its class file will be obtained from:

            http://www.javassist.org:80/java/org/javassist/test/Main.class 

          Furthermore, you can directly give a byte array to a ClassPool object and construct a CtClass object from that array. To do this, use ByteArrayClassPath. For example,

            ClassPool cp = ClassPool.getDefault(); byte[] b = a byte array; String name = class name; cp.insertClassPath(new ByteArrayClassPath(name, b)); CtClass cc = cp.get(name); 

          The obtained CtClass object represents a class defined by the class file specified by b. The ClassPool reads a class file from the given ByteArrayClassPath if get() is called and the class name given to get() is equal to one specified by name.

          If you do not know the fully-qualified name of the class, then you can use makeClass() in ClassPool:

            ClassPool cp = ClassPool.getDefault(); InputStream ins = an input stream for reading a class file; CtClass cc = cp.makeClass(ins); 

          makeClass() returns the CtClass object constructed from the given input stream. You can use makeClass() for eagerly feeding class files to the ClassPool object. This might improve performance if the search path includes a large jar file. Since a ClassPool object reads a class file on demand, it might repeatedly search the whole jar file for every class file. makeClass() can be used for optimizing this search. The CtClass constructed by makeClass() is kept in the ClassPool object and the class file is never read again.

          The users can extend the class search path. They can define a new class implementing ClassPath interface and give an instance of that class to insertClassPath() inClassPool. This allows a non-standard resource to be included in the search path.





          package com.cloud.dm.util;

          import java.io.File;
          import java.lang.reflect.Field;
          import java.net.URL;
          import java.util.ArrayList;
          import java.util.List;

          import javassist.ClassClassPath;
          import javassist.ClassPool;
          import javassist.CtClass;
          import javassist.CtMethod;
          import javassist.CtNewMethod;
          import javassist.bytecode.DuplicateMemberException;

          import org.apache.commons.lang3.StringUtils;

          public class Struts2GetterSetterGen {
              private static ClassPool pool = ClassPool.getDefault();

              public static void init() throws Exception {
                  URL url = Struts2GetterSetterGen.class.getResource("/");
                  List<File> resultList = new ArrayList<File>();
                  FileSearcher.findFiles(url.getFile(), "*Action.class", resultList);
                  for (File object : resultList) {
                      String className = StringUtils.substringBetween(object.toString(),
                              "classes\\", ".class").replaceAll("\\\\", ".");
                      CtClass ct = null;
                      pool.insertClassPath(new ClassClassPath(Class.forName(className))); //在servlet容器中啟動(dòng)
                      ct = pool.get(className);
                      Field[] fs = Class.forName(className).getDeclaredFields();
                      for (Field f : fs) {
                          genGetter(ct, f);
                          genSetter(ct, f);
                      }
                      ct.writeFile(url.getPath()); // 覆蓋之前的class文件
                  }
              }

              private static void genGetter(CtClass ct, Field field) throws Exception {
                  String string = "public " + field.getType().getName() + " get"
                          + StringUtils.capitalize(field.getName()) + "() {return "
                          + field.getName() + "; }";
                  CtMethod m = CtNewMethod.make(string, ct);
                  try {
                      ct.addMethod(m);
                  } catch (DuplicateMemberException e) {
                  }
              }

              private static void genSetter(CtClass ct, Field field) throws Exception {
                  String string = "public void set"
                          + StringUtils.capitalize(field.getName()) + "("
                          + field.getType().getName() + " " + field.getName() + "){this."
                          + field.getName() + " = " + field.getName() + "; }";
                  CtMethod m = CtNewMethod.make(string, ct);
                  try {
                      ct.addMethod(m);
                  } catch (DuplicateMemberException e) {
                  }
              }
          }


          posted on 2012-03-22 15:22 周磊 閱讀(4147) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 千阳县| 元氏县| 紫金县| 绥中县| 若尔盖县| 郯城县| 中西区| 永新县| 托里县| 漠河县| 揭阳市| 肥城市| 泰安市| 乾安县| 新余市| 临颍县| 全南县| 肥城市| 元氏县| 玛沁县| 习水县| 清流县| 常熟市| 德令哈市| 遂宁市| 诏安县| 凭祥市| 淅川县| 瑞金市| 广安市| 大埔县| 汶上县| 滦南县| 上饶市| 阿尔山市| 双江| 东方市| 县级市| 昆山市| 金山区| 嵊泗县|