在JAVA中,怎么利用反射获取一个方法

2024-12-17 10:18:34
推荐回答(4个)
回答1:

java中利用反射获取方法:

1.先找到方法所在类的字节码

2.找到需要被获取的方法

Class类中获取方法:

public Method[] getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

public Method[] getMethod(String methodName, Class...parameterTypes);表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class...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);
}
}

回答2:

import java.lang.reflect.*;
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";
}
}
这是我们当时学反射的时候打的代码 属性 方法 构造方法 都有

回答3:

import java.lang.reflect.Method; public class Methoder { /** * @param args */ public static void main(String[] args) throws Exception { // TODO 自动生成方法存根 Class c = Class.forName("ref.Test"); //包名.类名// Class ptypes[] ={Class.forName("java.lang.String")}; Class types[] =new Class[1]; types[0]=Class.forName("java.lang.String");//方法的参数对应下面的String aa Method m = c.getMethod("sayHello",types );//动态调用sayHello方法 Test t = new Test(); m.invoke(t,"hellojava" );//传给方法的的参数 } }

回答4:

Java反射-属性操作