JAVA反射机制的几种实现

来源:互联网 发布:社会网络理论有什么用 编辑:程序博客网 时间:2024/05/20 14:43
<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"});}}


0 0
原创粉丝点击