反射机制进行动态调用的两种创建方法实例与hama中的反射机制
2016-06-07 10:58
766 查看
package combine.invokeTest;
public class InvokeTest { public static BaseClass getClass(String className) throws ClassNotFoundException { return (BaseClass) ClassFactory.newInstance1(className); // return (BaseClass) ClassFactory.newInstance2(className); } public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException { try { String className = "combine.invokeTest.SubClass" ; BaseClass bClass = getClass(className) ; bClass.f() ; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } } } class BaseClass { BaseClass() { System.out.println("BaseClass Construct!"); } public void f() { System.out.println("BaseClass! "); } } class SubClass extends BaseClass { SubClass() { System.out.println("SubClass Construct!"); } public void f() { System.out.println("SubClass!"); } }
package combine.invokeTest; import java.lang.reflect.Constructor; import org.apache.hadoop.conf.Configuration; public class ClassFactory { private static final Class<?>[] EMPTY_ARRAY = new Class[]{}; public static <T> T newInstance1(String classPath) { T result; try { Class<?> policy = Class.forName(classPath); result = (T) policy.newInstance(); //采用Class对象的newInstance } catch (Exception e) { throw new RuntimeException(e); } return result; } public static <T> T newInstance2( String classPath) { T result; try { Class<?> theClass = Class.forName(classPath); Constructor<T> meth = (Constructor<T>)theClass.getDeclaredConstructor(EMPTY_ARRAY); meth.setAccessible(true); result = meth.newInstance(); //采用Constructor对象的newInstance } catch (Exception e) { throw new RuntimeException(e); } return result; } }
上述代码中,String className也可以作为Conf从配置文件中读取,参考Hama中的反射工厂实现代码;
public class MessageManagerFactory { public static final String MESSAGE_MANAGER_CLASS = "hama.messenger.class"; /** * Returns a messenger via reflection based on what was configured. * * @param conf * @return a messenger that was configured. */ @SuppressWarnings("unchecked") public static <M extends Writable> MessageManager<M> getMessageManager( Configuration conf) throws ClassNotFoundException { return (MessageManager<M>) ReflectionUtils.newInstance(conf .getClassByName(conf.get(MESSAGE_MANAGER_CLASS, org.apache.hama.bsp.message.HamaMessageManagerImpl.class .getCanonicalName())), conf); } }
进入ReflectionUtils类,
public static <T> T newInstance(Class<T> theClass, Configuration conf) { T result; try { Constructor<T> meth = (Constructor<T>) CONSTRUCTOR_CACHE.get(theClass); if (meth == null) { meth = theClass.getDeclaredConstructor(EMPTY_ARRAY); meth.setAccessible(true); CONSTRUCTOR_CACHE.put(theClass, meth); } result = meth.newInstance(); //使用java.lang.reflect.Constructor<T>创建的constructor创建实例 } catch (Exception e) { throw new RuntimeException(e); } setConf(result, conf); return result; }
相关文章推荐
- 文章标题
- hrtimer的简单使用
- ASP.NET中,HiddenField隐藏控件的用法
- C#模拟http 发送post或get请求的简单实例
- Spring Security 与 Oauth2 整合 步骤
- 读懂UML类图
- java.io.File中的绝对路径和相对路径.
- 这是第一篇
- 51nod 1264 基础
- [Leetcode]26. Remove Duplicates from Sorted Array
- 二维数组中的查找
- 剪刀手:Android平台上的图片裁剪库
- Xcode折叠函数设置 及快捷键
- 在DOS框下绘制圆
- hdu 5459(递推好题)
- 我的第一篇CSDN博客
- JAVA 开发的名词解释
- PHP-自己写的代码练习-数组
- 安卓 串口读取数据遇到的问题
- 傅里叶1