`

获取任意java类实例的方法和属性,包括父类的方法和属性

    博客分类:
  • JAVA
阅读更多
import java.lang.reflect.Field;   

import java.lang.reflect.Method;   

import java.util.ArrayList;   

import java.util.Date;   

import java.util.HashMap;   

import java.util.List;   

import java.util.Map;   

  

/**  

 * 获取任意java类实例的方法和属性,包括父类的方法和属性  

 * @author weishaoxiang  

 */  

public class Student extends School   

{   

       

    private String          code;   

    private String          name;   

    private Date            birthday;   

    private int             age;   

    private int             classNumber;   

    private boolean         isGoodStudent;   

    private List< School >    sch;   

    private School          sch1    = new School ( );   

       

    /**  

     * 测试  

     * @param args  

     */  

    public static void main ( String[] args )   

    {   

        Student student = new Student ( );   

        // 获取属性   

        Map< String, Class > map = getClassFields ( student.getClass ( ), true );   

        for ( Object key : map.keySet ( ) )   

        {   

            System.out.println ( "<field=" + key.toString ( ) + "> <Type=" + map.get ( key ) + ">" );   

        }   

        // 获取方法   

        List< Method > methods = getMothds ( student.getClass ( ), true );   

        for ( Method method : methods )   

        {   

            System.out.println ( method.getName ( ) );   

        }   

        System.out.println ( "方法总数:" + methods.size ( ) );   

    }   

       

    /**  

     * 获取类实例的属性值  

     * @param clazz  

     *            类名  

     * @param includeParentClass  

     *            是否包括父类的属性值  

     * @return 类名.属性名=属性类型  

     */  

    public static Map< String, Class > getClassFields ( Class clazz, boolean includeParentClass )   

    {   

        Map< String, Class > map = new HashMap< String, Class > ( );   

        Field[] fields = clazz.getDeclaredFields ( );   

        for ( Field field : fields )   

        {   

            map.put ( clazz.getName ( ) + "." + field.getName ( ), field.getType ( ) );   

        }   

        if ( includeParentClass )   

            getParentClassFields ( map, clazz.getSuperclass ( ) );   

        return map;   

    }   

       

    /**  

     * 获取类实例的父类的属性值  

     * @param map  

     *            类实例的属性值Map  

     * @param clazz  

     *            类名  

     * @return 类名.属性名=属性类型  

     */  

    private static Map< String, Class > getParentClassFields ( Map< String, Class > map, Class clazz )   

    {   

        Field[] fields = clazz.getDeclaredFields ( );   

        for ( Field field : fields )   

        {   

            map.put ( clazz.getName ( ) + "." + field.getName ( ), field.getType ( ) );   

        }   

        if ( clazz.getSuperclass ( ) == null )   

        {   

            return map;   

        }   

        getParentClassFields ( map, clazz.getSuperclass ( ) );   

        return map;   

    }   

       

    /**  

     * 获取类实例的方法  

     * @param clazz  

     *            类名  

     * @param includeParentClass  

     *            是否包括父类的方法  

     * @return List  

     */  

    public static List< Method > getMothds ( Class clazz, boolean includeParentClass )   

    {   

        List< Method > list = new ArrayList< Method > ( );   

        Method[] methods = clazz.getDeclaredMethods ( );   

        for ( Method method : methods )   

        {   

            list.add ( method );   

        }   

        if ( includeParentClass )   

        {   

            getParentClassMothds ( list, clazz.getSuperclass ( ) );   

        }   

        return list;   

    }   

       

    /**  

     * 获取类实例的父类的方法  

     * @param list  

     *            类实例的方法List  

     * @param clazz  

     *            类名  

     * @return List  

     */  

    private static List< Method > getParentClassMothds ( List< Method > list, Class clazz )   

    {   

        Method[] methods = clazz.getDeclaredMethods ( );   

        for ( Method method : methods )   

        {   

            list.add ( method );   

        }   

        if ( clazz.getSuperclass ( ) == Object.class )   

        {   

            return list;   

        }   

        getParentClassMothds ( list, clazz.getSuperclass ( ) );   

        return list;   

    }   

       

    public int getAge ( )   

    {   

        return age;   

    }   

       

    public void setAge ( int age )   

    {   

        this.age = age;   

    }   

}   

  

class Country   

{   

       

    private String  countryName;   

    private long    peopleNumber;   

       

    public long getPeopleNumber ( )   

    {   

        return peopleNumber;   

    }   

       

    public void setPeopleNumber ( long peopleNumber )   

    {   

        this.peopleNumber = peopleNumber;   

    }   

}   

  

class School extends Country   

{   

       

    private String  schoolName;   

    private String  address;   

       

    public String getAddress ( )   

    {   

        return address;   

    }   

       

    public void setAddress ( String address )   

    {   

        this.address = address;   

    }   

}  

 

分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    【05-面向对象(下)】

    •在定义接口时,接口里可以包含成员变量(只能是常量),方法(只能是抽象实例方法、类方法或默认方法),内 部类(包括内部接口、枚举类  –常量都是:public static final修饰  –方法都是:public abstract ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    (6) 类体包含了变量和方法。在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y ...

    Java开发技术大全 电子版

    3.7.2静态方法和实例方法的区别134 3.7.3静态代码块136 3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145...

    基于python3 类的属性、方法、封装、继承实例讲解

    对象可以包含任意数量和类型的数据。 python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。 在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object...

    \java超强笔记(超级经典)

    静态方法可以是泛型方法(在修饰符和返回值之间写泛型),但是不可以使用类的泛型。 static void copyArrayToList(Object[] os,List&lt;T&gt; ls){ //错误,T为类的泛型 } static &lt;E&gt; void ...

    day021-反射和注解笔记和代码.rar

    String getName() 获取全限定类名(全限定,包含包名) Class类中方法 String getSimpleName() 获取类名简称 Class类中方法 Package getPackage() 获取包名 Class类中方法 T newInstance() ...

    java自学之道

    2.6 获取网络属性信息 2.7 创建输入流(InputStream)对象 3、SOCKET连接 3.1 Socket通信的一般结构 3.2 TCP Socket编程 3.2.1 Socket类 3.2.2 ServerSocket类 3.3 UDP Socket编程 八、Java概念疑难解答 第2章 Java...

    抽象类和接口的区别

     包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样, 同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:  1)抽象方法必须为public或者protected...

    java经典面试2010集锦100题(不看你后悔)

    C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...

    net学习笔记及其他代码应用

    Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...

    Java实现文字随意拖动.rar

    Java实现文字随意拖动,随处拖动文本字符,移动到任意位置,super("文本的拖动处理"); //调用父类构造函数  String[] data = {"one", "two", "three", "four"}; //字符数组,用于构造列表框  DragList list=new...

    javaSE代码实例

    第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 77 6.1.1 面向对象程序设计思想的诞生 77 6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建...

    整理后java开发全套达内学习笔记(含练习)

    Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,...

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

    在一小时内学会 C#(txt版本)

    对 C++ 来说,前面例子中 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using ...

    图片的拖拽

    该程序能够实现图片的任意拖动。部分代码如下: super("图片的拖动效果"); //调用父类构造函数 Icon image=new ImageIcon(this.getClass().getResource("1.jpg")); //实例化图标 jlPic = new JLabel(image); //...

Global site tag (gtag.js) - Google Analytics