在JAVA中,怎么利用反射获取一个方法
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类型如String.class只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。
public Method getDeclaredMethod(String name,Class... parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)
参数: methodName: 表示被调用方法的名字
parameterTypes:表示被调用方法的参数的Class类型如String.class
举例:
class P{
public void t1(){}
void t2(){}
private void t3(){}
}
class People extends P{
public void sayHi() {
System.out.println("sayHi()");
}
public void sayHello(String name) {
System.out.println("sayHello(String name) " + "name = " + name);
}
private void sayGoodBye(String name, int age) {
System.out.println("sayGoodBye(String name, int age) " + "name = " + name + " age = " + age);
}
}
public class MethodDemo {
public static void main(String[] args) throws Exception {
Class clazz = People.class;
//获取类自身及父类所有public方法
Method ms[] = clazz.getMethods();
for (Method m : ms) {
System.out.println(m);
}
System.out.println("---------------------------");
//获取类自身所有方法(不会获取父类方法)
ms = clazz.getDeclaredMethods();
for (Method m : ms) {
System.out.println(m);
}
System.out.println("---------------------------");
//只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法
Method m = clazz.getMethod("t1", null);//public void com.reflex.P.t1()
System.out.println(m);
m = clazz.getMethod("sayHello", String.class);
System.out.println(m);
//Exception in thread "main" java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int)
//getMethod方法只能获取public的
// m = clazz.getMethod("sayGoodBye", String.class,int.class);
// System.out.println(m);
m = clazz.getDeclaredMethod("sayGoodBye", String.class,int.class);
System.out.println(m);
//带Declared的无法获取父类中的方法
// m = clazz.getDeclaredMethod("t1", null);//Exception in thread "main" java.lang.NoSuchMethodException:com.reflex.People.t1()
// System.out.println(m);
}
}
2013-09-25
public class TestClass{
public static void main(String[] args) throws Exception{
/*Class c=Class.forName("Student");
Field[] fs=c.getDeclaredFields();
System.out.println("class "+c.getSimpleName()+"{");
for(Field f:fs){
System.out.println(f.getType().getSimpleName()+" "+f.getName()+";");
}
Method[] ms=c.getDeclaredMethods();
for(Method m:ms){
System.out.print(m.getReturnType().getSimpleName()+" ");
System.out.print(m.getName()+"(");
Class[] ps=m.getParameterTypes();
for(Class p:ps){
System.out.print(p.getSimpleName()+",");
}
System.out.println("){}");
}
Constructor[] cons=c.getConstructors();
for(Constructor con:cons){
System.out.println(c.getSimpleName()+"(");
Class[] ps=con.getParameterTypes();
for(Class p:ps){
System.out.print(p.getSimpleName()+",");
}
System.out.println("){}");}*/
Object s=new Student("chun ",18);
Class c=s.getClass();
Field[] fs=c.getDeclaredFields();
for(Field f:fs){
f.setAccessible(true);
System.out.println(f.getName()+"="+f.get(s));
// f.set(s,"123");
// System.out.println(f.getName()+"="+f.get(s));
}
Class[] ps={};//无参数
Method m=c.getDeclaredMethod("study",ps);
Object[] os={};
m.invoke(s);
/* Class[] ps={String.class,int.class};//有参数
Method m=c.getDeclaredMethod("study",ps);//说明是哪个方法
Object[] os={"CoreJava",new Integer(3)};//简单类型变成包装类;
m.invoke(s,os);*/
}
}
class Student{
private String name;
private int age;
public Student(){}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void study(){
System.out.println("Student "+name+" study1");
}
public String study(String course,int time){
System.out.println("Student "+name+" studies "+course+" for "+time+" times");
if(time>=3)return "good";
else return "bad";
}
}
这是我们当时学反射的时候打的代码 属性 方法 构造方法 都有
2013-09-25