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

通过一个字符串"getUser()"反射出某个类里面的同名方法.并且可以得到该方法返回出的值... 通过一个字符串"getUser()"反射出某个类里面的同名方法.并且可以得到该方法返回出的值 展开
 我来答
jiaxin8000xxsc
2017-07-12 · TA获得超过3.6万个赞
知道大有可为答主
回答量:4009
采纳率:88%
帮助的人:949万
展开全部

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
展开全部
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";
}
}
这是我们当时学反射的时候打的代码 属性 方法 构造方法 都有
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-25
展开全部
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" );//传给方法的的参数 } }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
程云
2021-02-24
知道答主
回答量:54
采纳率:0%
帮助的人:2.5万
展开全部

Java反射-属性操作

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式