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

Java反射(五)-Java 方法反射的基本操作

2017-08-20 00:53 495 查看
如何获取某个方法。方法的名称和方法的参数列表才能唯一决定某个方法

方法反射的操作。method.invoke(对象,参数列表)

package com.imooc.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* Created by Administrator on 2017/8/20 0020.
*/
public class MethodDemo {
public static void main(String[] args) {
//要获取print(int,int)方法 1. 要获取一个方法就是要获取类的信息,获取类的信息首先要获取类的类类型
A a = new A();
Class class1 = a.getClass();
/*
2.获取方法 名称和参数列表来决定
getMethod获取的是public的方法
getDeclaredMethod获取的是自己声明的方法
*/

try {
//            Method method1 = class1.getDeclaredMethod("print",new Class[]{int.class,int.class});
Method m = class1.getDeclaredMethod("print",int.class,int.class);
//方法的反射操作
//a.print(10,20);方法的反射操作是用m对象来进行方法调用 和a.print调用效果是一样的
//用print的方法对象m来操作a
//如果方法有具体的返回值,o就得到返回类型,方法如果没有返回值,返回null
//            Object o = m.invoke(a,new Object[]{10,20});
Object o = m.invoke(a,10,20);

System.out.println("======================================");
Method m1 = class1.getMethod("print",String.class,String.class);
o = m1.invoke(a,"hello","world");

System.out.println("======================================");
Method m2 = class1.getMethod("print");
//            class1.getMethod("print",new Class[]{});
o = m2.invoke(a,new Object[]{});
//            o = m2.invoke(a);

} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

}
}

class A {

public void print() {
System.out.println("helloworld".toUpperCase());
}

public void print(int a,int b) {
System.out.println(a+b);
}

public void print(String a,String b) {
System.out.println(a.toUpperCase()+"," + b.toLowerCase());
}
}


例子,打印出当前对象的所有属性名和属性的值

/**
* toString方法,返回属性名称及值
* @return  属性名称及值,格式:[name]张三 [sex]男
*/
public String toString(){
StringBuffer result = new StringBuffer();
try {
//获取 泛型为Object以及Object的所有子类 类的类类型
Class<? extends Object> clazz = this.getClass();
//获取当前类类自己声明的成员变量
Field [] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//获取成员变量的名称
String fieldName = field.getName();
//如果得到的是序列化,跳过。
if ("serialVersionUID".equals(fieldName)) {
continue;
}
//拼接方法名:"get"+方法名 得到如:getId 形式的字符串
String methodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1, fieldName.length());
Method method; //Method类,方法对象。一个成员方法就是一个Method对象
Object resultObj;
method = clazz.getMethod(methodName); //得到方法名为methodName的方法对象
resultObj = method.invoke(this); //方法反射,得到属性的值
if (resultObj != null && !"".equals(resultObj)) { //如果属性值不为空,则按规则拼接 属性名 和 属性的值
result.append("[").append(fieldName).append("]").append(resultObj).append(" ");
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return result.toString(); //将StringBuffer转换成String
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: