`

获取任意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反射类中属性方法

    `Class`对象提供了访问类信息的入口,包括类名、父类、接口、构造器、方法和字段等。 1. **访问类的属性(Fields)** - `getFields()`:返回所有公共字段。 - `getDeclaredFields()`:返回包括私有的所有字段。 ...

    Java Object实例代码

    接口是Java中的一种类型,它只包含抽象方法和常量。接口用于定义行为规范,实现了接口的类必须实现接口中所有的抽象方法。接口提供了一种多继承机制,一个类可以实现多个接口,而Java只支持单继承。 通过分析提供...

    Java泛型的用法及T.class的获取过程解析

    首先,我们使用`getClass()`方法获取当前类的Class对象,然后使用`getGenericSuperclass()`方法获取当前类的父类的Type对象。最后,我们使用`getActualTypeArguments()`方法获取Type对象中的实际类型参数,然后将其...

    Java中类的概念理解及相关实例

    每个类都包含一系列属性(即变量)和方法(即函数),它们共同定义了一个特定类型的对象的行为和状态。 ##### 2.1 类的定义与结构 一个基本的Java类通常包含以下元素: - **成员变量** (Instance Variables):用于...

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

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

    常用的公共类java

    2. 类定义:一个Java源文件可以包含一个公共类和任意数量的非公共类。如果源文件包含一个公共类,那么该文件的名称必须与公共类的名称完全匹配,包括大小写,后缀为`.java`。例如,一个名为`CommonClass.java`的文件...

    常用java程序实例

    它可以用来获取当前日期和时间的各种组成部分,并且提供了多种获取时间的方法,例如: - `getDate()`:得到当前日期为这个月的第几天。 - `getDay()`:得到当前日期为这个星期的第几天。 - `getHours()`、`...

    java程序类方法的使用.doc

    在Java编程语言中,类方法是定义...总的来说,这个例子详细地展示了Java中面向对象编程的基本概念,包括类的结构、继承、构造函数、方法的定义与调用,以及对象的实例化和操作。这些都是Java程序员需要掌握的核心技能。

    java中构造方法和方法全面解析.pdf

    在Java编程语言中,构造方法和普通方法是两种不同的成员函数,它们各自有着特定的用途和规则。构造方法主要用于初始化类的新实例,而普通方法则是完成特定任务的代码块。 构造方法的关键特性包括: 1. **名称匹配*...

    JAVA基础--JAVA中的反射机制详解

    1. **获取类信息**:通过`Class`类的`forName()`方法可以获取到任意类的`Class`对象,从而获得该类的完整信息,包括类名、父类、接口、构造器、方法和字段等。 2. **创建对象**:使用`Class`对象的`newInstance()`...

    java-reflection-Xiangjie.rar_java 反射

    对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 在Java中,反射的核心类主要有三个:Class类、Constructor类和Method类。Class类...

    java 随机读写Java类文件

    每个Java类文件都是以`.class`后缀的二进制文件,它由魔数、版本号、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合等组成。这些信息定义了类的结构和行为。 2. **...

    Java反射机制

    通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法等,并能够调用类的任意方法。这种能力对于构建高度灵活和可扩展的系统尤为重要。 #### 二、JDK中提供的Reflection API Java反射相关的...

    java反射机制原理和反射机制总结

    对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2. **Class类** `java.lang.Class`代表运行时的类信息,通过`Class.forName()`或...

    Java反射之通过反射获取一个对象的方法信息(实例代码)

    Java反射是Java语言提供的一种强大的能力,允许程序在运行时检查和操作类、接口、对象以及它们的方法和字段。在上述实例中,我们探讨了如何使用反射来获取一个对象的方法信息。以下是关于Java反射和获取对象方法信息...

    用于创建类和对象的 Java 程序.docx

    本文将详细介绍 Java 中的类和对象的概念、组成部分、声明和实例化。 一、Java 中的类 Java 中的类是一组具有共同特征/行为和共同属性/属性的对象。类不是现实世界的实体,而是创建对象的模板、蓝图或原型。类不...

    java名词速查表 java名词速查表

    它通常包含一个或多个抽象方法,以及实现了一些具体的方法和属性。 - **特点**:不能被实例化;可以包含抽象方法(未实现的方法)和具体方法;可以有构造器、属性等。 #### Abstract method (抽象方法) - 抽象方法...

    Java反射demo

    对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,它代表了...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第13章_Java反射机制(共44页).pptx

    通过反射,开发者可以在运行时动态地获取类的结构信息,包括类的名称、属性、方法、构造器以及实现的接口,甚至可以在不预先知道具体类的情况下创建和调用对象。 1. `java.lang.Class`: 这个类是Java反射的起点,它...

    java面向对象编程、类的封装、接口和基本类库练习题.doc

    在Java中,类是创建对象的蓝图,它包含了数据(即实例变量)和操作这些数据的方法。下面我们将详细探讨这些知识点。 1. **类和对象**:类是对象的模板,定义了对象的状态(实例变量)和行为(方法)。对象是类的...

Global site tag (gtag.js) - Google Analytics