您的位置:首页 > 编程语言 > Java开发

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"});
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: