
package cnitcastservlet;
import javaioIOException;
import javalangreflectMethod;
import javaxservletServletException;
import javaxservlet>
java中利用反射获取方法:
1先找到方法所在类的字节码
2找到需要被获取的方法
Class类中获取方法:
public Method[] getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
public Method[] getMethod(String methodName, Class<T>parameterTypes);表示获取指定的一个公共的方法,包括继承的
参数: methodName:表示获取的方法的名字
parameterTypes:表示获取的方法的参数的Class类型
public Method[] getDeclaredMethod(String methodName, Class<T>parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法。
参数:methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如Stringclass只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。
public Method getDeclaredMethod(String name,Class parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)
参数: methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如Stringclass
举例:
class P{public void t1(){}
void t2(){}
private void t3(){}
}
class People extends P{
public void sayHi() {
Systemoutprintln("sayHi()");
}
public void sayHello(String name) {
Systemoutprintln("sayHello(String name) " + "name = " + name);
}
private void sayGoodBye(String name, int age) {
Systemoutprintln("sayGoodBye(String name, int age) " + "name = " + name + " age = " + age);
}
}
public class MethodDemo {
public static void main(String[] args) throws Exception {
Class clazz = Peopleclass;
//获取类自身及父类所有public方法
Method ms[] = clazzgetMethods();
for (Method m : ms) {
Systemoutprintln(m);
}
Systemoutprintln("---------------------------");
//获取类自身所有方法(不会获取父类方法)
ms = clazzgetDeclaredMethods();
for (Method m : ms) {
Systemoutprintln(m);
}
Systemoutprintln("---------------------------");
//只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法
Method m = clazzgetMethod("t1", null);//public void comreflexPt1()
Systemoutprintln(m);
m = clazzgetMethod("sayHello", Stringclass);
Systemoutprintln(m);
//Exception in thread "main" javalangNoSuchMethodException: comreflexPeoplesayGoodBye(javalangString, int)
//getMethod方法只能获取public的
// m = clazzgetMethod("sayGoodBye", Stringclass,intclass);
// Systemoutprintln(m);
m = clazzgetDeclaredMethod("sayGoodBye", Stringclass,intclass);
Systemoutprintln(m);
//带Declared的无法获取父类中的方法
// m = clazzgetDeclaredMethod("t1", null);//Exception in thread "main" javalangNoSuchMethodException:comreflexPeoplet1()
// Systemoutprintln(m);
}
}
package comzswtest;
import javalangreflectMethod;
import javalangreflectInvocationTargetException;
public class InvokeTester {
private String name;
public void setName(String name){
thisname = name;
}
public String getName(){
return name;
}
public InvokeTester() {
}
public int add(int param1, int param2) {
return param1 + param2;
}
public String echo(String mesg) {
return "echo" + mesg;
}
public static void main(String[] args) {
Class classType = InvokeTesterclass;
try {
Object invokertester = classTypenewInstance(); //1
Method addMethod = classTypegetMethod("add", new Class[] { //2
intclass, intclass
});
Object result = addMethodinvoke(invokertester, new Object[] { //3
new Integer(100), new Integer(200)
});
Systemoutprintln(result);
//////////////////////
Method echo = classTypegetMethod("echo", new Class[] {Stringclass});
Object obj = echoinvoke(invokertester,
new Object[] {new String("jy is very good!!!")});
Systemoutprintln(objtoString());
////////////////////
InvokeTester test = new InvokeTester(); //1
testsetName("黄翊"); //2
//Method[] methods;
Method[] methods = testgetClass()getDeclaredMethods(); //3
//循环查找获取id方法,并执行查看是否有返回值
for (int i = 0; i < methodslength; i++) {
//如果此方法有get和Id关键字则执行
if (methods[i]getName()indexOf("get") != -1 && methods[i]getName()indexOf("Name") != -1) {
try{
// 获取此get方法返回值,判断是否有值,如果没有值说明即将执行的 *** 作新增
if (methods[i]invoke(test, null) == null) { //4
Systemoutprintln("此对象没有值!!!");
} else {
Object strName = methods[i]invoke(test, null);
Systemoutprintln(strName);
}
}catch(Exception e){
Systemoutprint("");
}
}
}
} catch (IllegalAccessException ex) {
} catch (InstantiationException ex) {
} catch (SecurityException ex) {
} catch (NoSuchMethodException ex) {
} catch (InvocationTargetException ex) {
} catch (IllegalArgumentException ex) {
}
}
}
post 请求获取body内容
注意:>
package commikan;
import javalangannotation;
/
@author Mikan
@date 2015-08-04 23:39
/
@Target(ElementTypePARAMETER)
@Retention(RetentionPolicyRUNTIME)
@Documented
public @interface Param {
String value();
}
获取注解中的参数名的工具类:
package commikan;
import javalangannotationAnnotation;
import javalangreflectMethod;
/
@author Mikan
@date 2015-08-05 00:26
/
public class ParameterNameUtils {
/
获取指定方法的参数名
@param method 要获取参数名的方法
@return 按参数顺序排列的参数名列表
/
public static String[] getMethodParameterNamesByAnnotation(Method method) {
Annotation[][] parameterAnnotations = methodgetParameterAnnotations();
if (parameterAnnotations == null || parameterAnnotationslength == 0) {
return null;
}
String[] parameterNames = new String[parameterAnnotationslength];
int i = 0;
for (Annotation[] parameterAnnotation : parameterAnnotations) {
for (Annotation annotation : parameterAnnotation) {
if (annotation instanceof Param) {
Param param = (Param) annotation;
parameterNames[i++] = paramvalue();
}
}
}
return parameterNames;
}
}
测试类:
package commikan;
import javalangreflectMethod;
import javautilArrays;
/
@author Mikan
@date 2015-08-04 23:40
/
public class ParameterNameTest {
public void method1(@Param("parameter1") String param1, @Param("parameter2") String param2) {
Systemoutprintln(param1 + param2);
}
public static void main(String[] args) throws Exception {
Class<ParameterNameTest> clazz = ParameterNameTestclass;
Method method = clazzgetDeclaredMethod("method1", Stringclass, Stringclass);
String[] parameterNames = ParameterNameUtilsgetMethodParameterNamesByAnnotation(method);
Systemoutprintln(ArraystoString(parameterNames));
}
}
以上就是关于XML转换中的堆栈溢出异常问题,怎么解决全部的内容,包括:XML转换中的堆栈溢出异常问题,怎么解决、java中 如何得到泛型参数的类型,并在另一个方法中使用、在JAVA中,怎么利用反射获取一个方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)