package com.wxf.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Java 反射测试
* @author Administrator
*
*/
public class ReflectTest {
/**
* For the test of method :getAllMethodList()
* @param obj
* @param x
* @return
* @throws NullPointerException
*/
private ReflectTest testMethod(Object obj, int x) throws NullPointerException {
if (obj == null)
throw new NullPointerException();
return new ReflectTest();
}
/**
* 获取类中所有的方法列表
* 方法名称、行参类型、异常类型、返回值类型
*/
private void getAllMethodList(Class c){
Method methlist[] = c.getDeclaredMethods();//c.getMethods()可获取继承来的所有方法
for (int i = 0; i < methlist.length; i++) {
Method m = methlist[i];
System.out.println("name = " + m.getName());//方法名
System.out.println("declaring class = " + m.getDeclaringClass());//所在的类
Class pvec[] = m.getParameterTypes();//取得方法的形参类型
for (int j = 0; j < pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
Class evec[] = m.getExceptionTypes();//取得方法抛出的异常对象类型
for (int j = 0; j < evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
System.out.println("return type = " + m.getReturnType());//取得方法返回值的类型
System.out.println("-----");
}
}
/**
* For the test of method "excuteMethodByMethodName"
* @param a
* @param b
* @return
*/
public int add(int a ,int b){
return a+b;
}
/**
* 动态调用方法
* @param c
* @return
*/
public Integer excuteMethodByMethodName(Class c,ReflectTest rt){
Object resultObj = null;//存储结果对象
Method md = null;
Class[] ptpyes=new Class[2];//预定义要被调用的方法参数列表
ptpyes[0]=Integer.TYPE;
ptpyes[1]=Integer.TYPE;
try {
md = c.getMethod("add", ptpyes);//add是要被调用的方法名;通过行参ptpyes定位到具体哪个方法被调用(考虑多态的情况)
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
Object[] argus=new Object[2];//argus是传给被调用方法的实参
argus[0]=new Integer(22);
argus[1]=new Integer(33);
try {
//通过Method md 定位要被调用的方法名;
//通过ReflectTest rt 定位要被调用的方法所在的类;
//通过Object[] argus 将实参传递给被调用的方法
resultObj = md.invoke(rt, argus);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Integer result=(Integer)resultObj;
return result;
}
public static void main(String args[]) {
Class c=null;
try {
c=Class.forName("com.wxf.reflect.ReflectTest");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ReflectTest rt=new ReflectTest();
rt.getAllMethodList(c);
Integer itg=rt.excuteMethodByMethodName(c, rt);
System.out.println(itg.intValue());
}
}
分享到:
相关推荐
Java反射简单例子,给刚刚学习反射的人用...
java学习例子 java java例子 java反射
JAVA反射机制及应用例子.。。Reflection API
讲解了JAVA中反射机制,包含例子,代码!对初学者很有用
重新学习Spring相关书籍时,看到一些反射的代码例子;分享一下
java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;
java反射机制例子
java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
java反射详解,详细说明java反射内部机制,适合初学者。
java reflect Method getDeclaredMethod invoke getConstructor
代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...
反射小例子
Java反射实例,可以给初学反射的同志们一定帮助。一个简单实例,可以更好的理解反射的规矩。
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。
Java反射案例,可以参考: Java反射机制 - 相关API:https://blog.csdn.net/niuba123456/article/details/85951088
一个例子8个demo让你了解Java反射机制
java 反射使用的整理和委托实现接口反射的例子
有大量的实验例子和反射的各种方法说明,有大量的实验例子和反射的各种方法说明。