[Jiemamy-notify:1969] commit [3127] クラスを追加しました。

Back to archive index

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



Jiemamy-notify メーリングリストの案内
Back to archive index