Java中通过反射获取类的信息(方法名,参数,构造函数等)

这里,已经写好了几个方法通过反射获取信息。

/**
     * 获取类的方法名,参数列表信息
     * @param obj对象所属类的信息
     */
    public  static void printMethodMessage(Object obj){
        //获取类类型
        Class c=obj.getClass(); //传递的是哪个子类,c就是该子类的类类型
        System.out.println("名称:"+c.getName());
        //methpd 类  一个成员方法就是一个Method对象  
        //getMethods()获取所有public函数,包括父类继承
        //getDeclaredMethods()类自己声明函数,不问访问权限
        Method [] ms=c.getMethods();
        for (int i = 0; i < ms.length; i++) {
            Class returnType=ms[i].getReturnType();
            System.out.print(returnType.getName()+" ");
            System.out.print(ms[i].getName()+"(");
            //获取参数类型,得到的是参数列表类型的类类型
            Class [] paramType=ms[i].getParameterTypes();
            for (Class   class1 : paramType) {
                System.out.print(class1.getName()+",");
            }
            System.out.println(")");
        }
        System.out.println("--------------------------");               
    }


    /**
     * 获取成员变量类型和名称
     * @param obj
     */
    public static void printFieldMessage(Object obj) {
        Class c=obj.getClass();
        Field [] fs=c.getDeclaredFields();
        for (Field field : fs) {
            //得到成员变量类型 的类类型
            Class fieldType=field.getType();
            //成员类型名称
            String name=fieldType.getName();
            //成员变量名称
            String fieldName=field.getName();   
            System.out.println(name+","+fieldName);
        }
    }

    /**
     * 获取构造函数信息
     * @param obj
     */
    public static void printConstructorMessage(Object obj){
        Class c=obj.getClass();
        //getConstructors() 获取所有public 的构造函数
//      Constructor [] cs=c.getConstructors();
        //getDeclaredConstructors() 不管访问权限
        Constructor [] cs=c.getDeclaredConstructors();
        for (Constructor con : cs) {
            //获取名字
            System.out.print(con.getName()+"(");
            //获取参数列表
            Class [] paramType=con.getParameterTypes();
            for (Class class1 : paramType) {
                System.out.print(class1.getName()+",");
            }
            System.out.println(")");
        }
    }

还有通过类的方法,查找类的方法,参数列表信息:

package cn.demo1;

import java.lang.reflect.Method;

public class MethodDemo1 {

    public static void main(String[] args) {

        // 获取方法:
        Test test = new Test();
        Class c1 = test.getClass();

        try {
            // c1.getDeclaredMethod("print", new Class[]{int.class,int.class});
            Method m = c1.getMethod("print", int.class, int.class);
            // 方法反射操作,m进行调用,null表示没有返回值
            Object o = m.invoke(test, new Object[] { 10, 30 });
            Object o1 = m.invoke(test, 10, 40);
            System.out.println("==============");
            Method m1 = c1.getMethod("print", String.class, String.class);
            Object o2 = m1.invoke(test, "das", "dsasdew");
            System.out.println("==============");
            Method m2 = c1.getMethod("print");
            o2 = m2.invoke(test);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class Test {
    public void print() {
        System.out.println("fdaadsssssss");
    }

    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.toUpperCase());
    }

}

多看看api,其实也不是太难。一天一个知识点。就到这里了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值