JAVA反射机制的几种实现
2015-08-18 17:31
393 查看
<pre name="code" class="java">package com.user.test; import java.lang.reflect.Method; /** * java反射练习 * @author lizhixian * @version 1.0 * @create_date 2015-7-15 下午2:38:34 */ public class InvokeTest { public void testInvoke(String name){ System.out.println("welcome:"+name); } public void testInvoke(){ System.out.println("welcome:haha"); } public static void testStatic(String name){ System.out.println("welcome static:"+name); } /** * 通过类字符串名调用 * @param className 类完整路径 */ public void newClass(String className){ try { Object obj = Class.forName(className).newInstance(); //Method method = obj.getClass().getMethod("testInvoke",new Class[]{String.class});//只能调用公有方法 String paramType = "java.lang.String";//参数类型 Method method = obj.getClass().getDeclaredMethod("testInvoke",new Class[]{Class.forName(paramType).newInstance().getClass()}); method.invoke(obj,new Object[]{"lzx"}); } catch (Exception e) { e.printStackTrace(); } } /** * 通过泛型调用 * @param <T> 类 XXX.class * @param methodName 方法名 */ public <T> void newClass(Class<T> cls,String methodName){ try { Method method = cls.getDeclaredMethod(methodName,new Class[]{}); method.invoke(cls.newInstance(),new Object[]{}); } catch (Exception e) { e.printStackTrace(); } } /** * 调用静态方法 * @param className 类完整路径 * @param methodName 方法名 * @param args 该方法对应的参数 */ public Object invokeStaticMethod(String className, String methodName, Object[] args){ Object retObj = null; try { Class<?> ownerClass = Class.forName(className); Class<?>[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getDeclaredMethod(methodName,argsClass); retObj = method.invoke(null, args); } catch (Exception e) { e.printStackTrace(); } return retObj; } /** * 调用除静态静态方法外的其他方法 */ public <T> Object invokeMethod(Class<T> owner, String methodName, Object[] args){ Object retObj = null; try { Class<?>[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = owner.getDeclaredMethod(methodName,argsClass); retObj = method.invoke(owner, args); } catch (Exception e) { e.printStackTrace(); } return retObj; } public static void main(String[] args) { InvokeTest test = new InvokeTest(); test.newClass("com.user.test.InvokeTest"); test.newClass(InvokeTest.class,"testInvoke"); test.invokeStaticMethod("com.user.test.InvokeTest","testStatic",new Object[]{"lzx"}); test.invokeMethod(InvokeTest.class,"testStatic",new Object[]{"lsl"}); } }
相关文章推荐
- Java 继承
- java,c#将秒转换为hh:MM:ss的实现
- Java EE_学习规划
- Java之Exception
- Unsupported major.minor version 51.0解决
- MyEclipse查看Struts2源码及Javadoc文档
- Spring事务管理只对出现运行期异常进行回滚
- java常见连接池比较
- Spring代理模式
- Java单元测试简述
- java web几种开发模式(转)
- [Java教程]RDD专题
- Java异常体系结构
- 使用Struts2框架后访问Web页面报java.lang.NoSuchMethodException:
- java为什么需要数据库连接池
- Java finalize方法使用
- Java 发送邮件
- eclipse & as 项目编码修改
- 装饰设计模式 Java版
- Java:java+内存分配及变量存储位置的区别