`
weishaoxiang
  • 浏览: 96269 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多
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开发技术大全(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