Java-反射之获取方法信息

简单地学习了一下Java的反射机制和Class类,我们就可以通过这种方式来获取一个类的详细信息。

1.获得基本数据类型和简单的类的类类型

1     public static void main(String[] args) {
2         Class c1 = int.class; // 拿到int的类类型 -- 相当于是int字节码
3         Class c2 = Integer.class; //Integer的类类型--与上面的int是不一样的
4         Class c3 = Void.class;
5         System.out.println(c1.getName());
6         System.out.println(c2.getName()); //取得类的完整名称
7         System.out.println(c2.getSimpleName()); //取得简单的类名
8
9     }

2.打印类的信息--成员函数

/**
     * 打印类的信息,包括类的成员函数、成员变量
     *
     * @param obj
     */
    public static void printClassMessage(Object obj) {
        Class c1 = obj.getClass(); // 获取该类的类类型,如果该类是Object的话,表示是Object的类类型,否则是Obejct子类的类类型
        System.out.println(c1.getName()); //获得该类的类名
        /**
         * 万事万物结尾对象,所以在类中,一个方法也是对象,是Method的对象
         * getMethods获取的是所有的public方法,包括从父类继承过来的方法
         * getDeclaredMethods 获取的是自己声明的方法,不论是什么访问权限
         */
        Method []method = c1.getMethods();
        for(int i = 0, n = method.length; i< n; i++)
        {
            //得到的是方法返回值类型的类类型--比如String,则得到的是String.class
            Class type = method[i].getReturnType();
            System.out.print(type.getSimpleName()+" ");
            //打印方法的名字
            System.out.print(method[i].getName() + "(");
            //获取参数列表的类类型
            Class [] methodParameterTypes = method[i].getParameterTypes();
            for(int j = 0, m = methodParameterTypes.length; j < m; j++)
            {
                System.out.print(methodParameterTypes[j].getSimpleName() + " ");
            }
            System.out.println(")");
        }
    }

3.获取构造方法的信息

 1         /**
 2          * 构造方法也是对象, 是Java.lang.reflect.Constructor的对象
 3          * getConstructors获得所有的public构造方法
 4          * getDeclaredConstructors获得所有的构造方法
 5          */
 6         Constructor[] declaredConstructors = c1.getDeclaredConstructors();
 7         for(int i = 0, n = declaredConstructors.length; i < n; i++)
 8         {
 9             System.out.print(declaredConstructors[i].getName() + "(");
10             Class ParameterTypes[] = declaredConstructors[i].getParameterTypes();
11             for(int j = 0, m =  ParameterTypes.length; j < m; j++)
12             {
13                 System.out.print(ParameterTypes[j].getName() + " ");
14             }
15             System.out.println(")");
16         }
时间: 2024-10-27 02:50:40

Java-反射之获取方法信息的相关文章

反射之获取方法信息

本文接上文"反射之Class类的使用",以编写一个用来获取类的信息(成员函数.成员变量)的工具类来讲解"反射之获取方法信息" 1.新建工具类,命名ClassUtil,输入一个对象(Object),输出该对象的基础信息方法(printClassMessage) 1 /** 2 * 打印类的信息,成员函数.成员变量 3 * Created by Format on 2017/6/3. 4 */ 5 public class ClassUtil { 6 7 } 2.获取类

javassist:增强型的java反射工具,获取方法参数名

java的反射是不能获取方法的参数名的.比如: [java] view plaincopyprint? public String concatString(String str1,String str2){ return str1+str2; }     public String concatString(String str1,String str2){         return str1+str2;     } 想获取"str1",和"str1"这个参数

Java 反射理解(三)-- Java获取方法信息

Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void main(String[] args) { Class c1 = int.class;//int 的类类型 Class c2 = String.class;//String类的类类型,可以理解为String类字节码 Class c3 = double.class; Class c4 = Doubl

java 反射机制-获取对应class信息

1 package reflection; 2 3 public class User { 4 public String name; 5 protected int age; 6 String address; 7 private String sex; 8 9 public User() { 10 super(); 11 } 12 13 public User(String name, int age, String sex) { 14 super(); 15 this.name = nam

J2SE_通过反射能获取方法参数名称吗?

一.Java通过反射可以获取方法的参数名称吗? 不能!!! 二.测试示例代码: import java.lang.reflect.Method; class T { public void print(String username) { System.out.println(username); } } public class Test { public static void main(String[] args) { T t = new T(); t.print("zhangsan&qu

乐字节Java反射之三:方法、数组、类加载器和类的生命周期

本文承接上一篇:乐字节Java发射之二:实例化对象.接口与父类.修饰符和属性 继续讲述Java反射之三:方法.数组.类加载器 一.方法 获取所有方法(包括父类或接口),使用Method即可. public static void test() throws Exception { Class<?> clz = Class.forName("com.shsxt.ref.simple.User "); //获取属性 System.out.println("======

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

java 反射机制获取类名、属性、方法、构造器和反射动态使用

被反射的类: @Table("tb_student") public class Student { @Fields(columnName="id",type="int",length=10) private int id; @Fields(columnName="studentName",type="varchar",length=10) private String studentName; @Fiel

Java反射之剖析方法

继上篇反射构造函数后,今剖析函数方法. 要通过反射执行方法: 1.可以先反射出类或构造函数,创建实例对象,通过对象调用方法(反射通过构造函数创建对象参见上篇). 2.可以通过类反射出方法,传入关联对象,从而实现对象调用方法. 以下是一个简单测试类: 包含两个文件: 1.Person.java,用于反射操作 2.Deom:Demo_MtdRft.java,反射的测试代码 测试的情况包括:1.公有方法,2.私有方法,3.无参数方法,4.有参数方法,5静态方法 下面是两个测试代码文件: Person.

巧用Mono.Cecil反射加载类型和方法信息

最近在做服务的细粒度治理,统一管理所有服务的方法.参数.返回值信息.方便后续的各个模块之间的对接和协作. 目前系统中所有的服务,管理到接口契约粒度,即服务接口声明和服务接口实现.要做服务的细粒度治理: 首先需要将服务的各个方法信息全部反射出来,然后再统一管理. 大致的思路是这样的: 1. 下载所有最新的服务包(dll文件集合) 2. 获取所有的服务定义信息 3. 反射加载出每个服务详细的方法信息(方法名.参数.返回值等) 一.下载所有最新的服务包 系统中几百个服务,几十个服务组,每个服务都对应一