svnno****@sourc*****
svnno****@sourc*****
2009年 4月 6日 (月) 02:15:43 JST
Revision: 3127 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=3127 Author: j5ik2o Date: 2009-04-06 02:15:43 +0900 (Mon, 06 Apr 2009) Log Message: ----------- クラスを追加しました。 メソッドを追加しました。 Modified Paths: -------------- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassUtil.java Added Paths: ----------- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassPoolUtil.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ModifierUtil.java -------------- next part -------------- Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassPoolUtil.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassPoolUtil.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassPoolUtil.java 2009-04-05 17:15:43 UTC (rev 3127) @@ -0,0 +1,186 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * This file is part of Jiemamy. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.jiemamy.composer.importer.utils; + +import java.util.Collections; +import java.util.Map; +import java.util.WeakHashMap; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.LoaderClassPath; +import javassist.NotFoundException; + +/** + * ClassPool用のユーティリティクラス。 + * + * @author j5ik2o + */ +public class ClassPoolUtil { + + /** + * ClassPoolのキャッシュ。 + */ + protected static final Map<ClassLoader, ClassPool> CLASS_POOL_MAP = + Collections.synchronizedMap(new WeakHashMap<ClassLoader, ClassPool>()); + + + /** + * CtClassを作成する。 + * + * @param classPool + * @param name + * @return CtClass + * @throws NotFoundException + */ + public static CtClass createCtClass(final ClassPool classPool, final String name) throws NotFoundException { + return createCtClass(classPool, name, Object.class); + } + + /** + * CtClassを作成する。 + * + * @param classPool + * @param name + * @param superClass + * @return CtClass + * @throws NotFoundException + */ + public static CtClass createCtClass(final ClassPool classPool, final String name, final Class superClass) + throws NotFoundException { + return createCtClass(classPool, name, toCtClass(classPool, superClass)); + } + + /** + * CtClassを作成します。 + * + * @param classPool + * @param name + * @param superClass + * @return CtClass + */ + public static CtClass createCtClass(final ClassPool classPool, final String name, final CtClass superClass) { + return classPool.makeClass(name, superClass); + } + + /** + * リソースを破棄します。 + */ + public static synchronized void dispose() { + synchronized (ClassPoolUtil.class) { + CLASS_POOL_MAP.clear(); + } + } + + /** + * ClassPoolを返します。 + * + * @param targetClass + * @return ClassPool + */ + public static ClassPool getClassPool(final Class targetClass) { + return getClassPool(ClassLoaderUtil.getClassLoader(targetClass)); + } + + /** + * ClassPoolを返します。 + * + * @param classLoader + * @return ClassPool + */ + public static ClassPool getClassPool(final ClassLoader classLoader) { + ClassPool classPool = CLASS_POOL_MAP.get(classLoader); + if (classPool == null) { + if (classLoader == null) { + return ClassPool.getDefault(); + } + classPool = new ClassPool(); + classPool.appendClassPath(new LoaderClassPath(classLoader)); + CLASS_POOL_MAP.put(classLoader, classPool); + } + return classPool; + } + + /** + * CtClassに変換する。 + * + * @param classPool + * @param clazz + * @return CtClass + * @throws NotFoundException {@link CtClass}が見つからなかった場合 + */ + public static CtClass toCtClass(final ClassPool classPool, final Class clazz) throws NotFoundException { + return toCtClass(classPool, ClassUtil.getSimpleClassName(clazz)); + } + + /** + * CtClassに変換する。 + * + * @param classPool + * @param className + * @return CtClass + * @throws NotFoundException {@link CtClass}が見つからなかった場合 + */ + public static CtClass toCtClass(final ClassPool classPool, final String className) throws NotFoundException { + return classPool.get(className); + } + + /** + * CtClassの配列に変換する。 + * + * @param classPool + * @param classes + * @return CtClassの配列 + * @throws NotFoundException + */ + public static CtClass[] toCtClassArray(final ClassPool classPool, final Class<?>[] classes) + throws NotFoundException { + if (classes == null) { + return null; + } + final CtClass[] result = new CtClass[classes.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = toCtClass(classPool, classes[i]); + } + return result; + } + + /** + * CtClassの配列に変換する。 + * + * @param classPool + * @param classNames + * @return CtClassの配列 + * @throws NotFoundException + */ + public static CtClass[] toCtClassArray(final ClassPool classPool, final String[] classNames) + throws NotFoundException { + if (classNames == null) { + return null; + } + final CtClass[] result = new CtClass[classNames.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = toCtClass(classPool, classNames[i]); + } + return result; + } + + private ClassPoolUtil() { + + } +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassPoolUtil.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassUtil.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassUtil.java 2009-04-05 17:02:13 UTC (rev 3126) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ClassUtil.java 2009-04-05 17:15:43 UTC (rev 3127) @@ -23,6 +23,11 @@ import java.util.HashMap; import java.util.Map; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import javassist.NotFoundException; + import org.apache.commons.lang.StringUtils; import org.jiemamy.exception.UnexpectedConditionError; @@ -166,21 +171,27 @@ /** * このクラスに定義された{@link Field フィールド}をクラスファイルに定義された順番で取得する。 * - * @param clazz - * 対象のクラス + * @param clazz 対象のクラス * @return このクラスに定義されたフィールドの配列 + * @throws NotFoundException {@link CtClass}が見つからなかった場合 + * @throws NoSuchFieldException フィールドが見つからなかった場合 */ -// public static Field[] getDeclaredFields(final Class clazz) { -// final ClassPool pool = ClassPoolUtil.getClassPool(clazz); -// final CtClass ctClass = ClassPoolUtil.toCtClass(pool, clazz); -// final CtField[] ctFields = ctClass.getDeclaredFields(); -// final int size = ctFields.length; -// final Field[] fields = new Field[size]; -// for (int i = 0; i < size; ++i) { -// fields[i] = ClassUtil.getDeclaredField(clazz, ctFields[i].getName()); -// } -// return fields; -// } + public static Field[] getDeclaredFields(final Class<?> clazz) throws NotFoundException, NoSuchFieldException { + try { + final ClassPool pool = ClassPoolUtil.getClassPool(clazz); + final CtClass ctClass = ClassPoolUtil.toCtClass(pool, clazz); + final CtField[] ctFields = ctClass.getDeclaredFields(); + final int size = ctFields.length; + final Field[] fields = new Field[size]; + for (int i = 0; i < size; ++i) { + fields[i] = ClassUtil.getDeclaredField(clazz, ctFields[i].getName()); + } + return fields; + } finally { + ClassPoolUtil.dispose(); + } + } + /** * そのクラスに宣言されている {@link Method}を取得する。 * Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ModifierUtil.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ModifierUtil.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ModifierUtil.java 2009-04-05 17:15:43 UTC (rev 3127) @@ -0,0 +1,171 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * This file is part of Jiemamy. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.jiemamy.composer.importer.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +/** + * {@link Modifier}用のユーティリティクラスです。 + * + * @author j5ik2o + * + */ +public class ModifierUtil { + + static final int BRIDGE = 0x00000040; + + static final int SYNTHETIC = 0x00001000; + + + /** + * <code>abstract</code>かどうかを取得する。 + * + * @param clazz クラス + * @return <code>abstract</code>かどうか + */ + public static boolean isAbstract(Class<?> clazz) { + return isAbstract(clazz.getModifiers()); + } + + /** + * <code>abstract</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>abstract</code>かどうか + */ + public static boolean isAbstract(int modifier) { + return Modifier.isAbstract(modifier); + } + + /** + * <code>final</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>final</code>かどうか + */ + public static boolean isFinal(int modifier) { + return Modifier.isFinal(modifier); + } + + /** + * <code>final</code>かどうかを取得する。 + * + * @param method メソッド + * @return <code>final</code>かどうか + */ + public static boolean isFinal(Method method) { + return isFinal(method.getModifiers()); + } + + /** + * インスタンスフィールドかどうかを取得する。 + * + * @param field フィールド + * @return インスタンスフィールドかどうか + */ + public static boolean isInstanceField(Field field) { + int m = field.getModifiers(); + return !isStatic(m) && !isFinal(m); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param f フィールド + * @return パブリックかどうか + */ + public static boolean isPublic(Field f) { + return isPublic(f.getModifiers()); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>public</code>かどうか + */ + public static boolean isPublic(int modifier) { + return Modifier.isPublic(modifier); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param m メソッド + * @return パブリックかどうか + */ + public static boolean isPublic(Method m) { + return isPublic(m.getModifiers()); + } + + /** + * <code>public</code>,<code>static</code>,<code>final</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>public</code>,<code>static</code>,<code>final</code>かどうか + */ + public static boolean isPublicStaticFinal(int modifier) { + return isPublic(modifier) && isStatic(modifier) && isFinal(modifier); + } + + /** + * <code>public</code>,<code>static</code>,<code>final</code>かどうかを取得する。 + * + * @param f フィールド + * @return <code>public</code>,<code>static</code>,<code>final</code>かどうか + */ + public static boolean isPublicStaticFinalField(Field f) { + return isPublicStaticFinal(f.getModifiers()); + } + + /** + * <code>static</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>static</code>かどうか + */ + public static boolean isStatic(int modifier) { + return Modifier.isStatic(modifier); + } + + /** + * <code>transient</code>かどうかを取得する。 + * + * @param field フィールド + * @return <code>transient</code>かどうか + * @see #isTransient(int) + */ + public static boolean isTransient(Field field) { + return isTransient(field.getModifiers()); + } + + /** + * <code>transient</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>transient</code>かどうか + */ + public static boolean isTransient(int modifier) { + return Modifier.isTransient(modifier); + } + + private ModifierUtil() { + } +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ModifierUtil.java ___________________________________________________________________ Added: svn:mime-type + text/plain