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;
}
}
分享到:
相关推荐
`Class`对象提供了访问类信息的入口,包括类名、父类、接口、构造器、方法和字段等。 1. **访问类的属性(Fields)** - `getFields()`:返回所有公共字段。 - `getDeclaredFields()`:返回包括私有的所有字段。 ...
接口是Java中的一种类型,它只包含抽象方法和常量。接口用于定义行为规范,实现了接口的类必须实现接口中所有的抽象方法。接口提供了一种多继承机制,一个类可以实现多个接口,而Java只支持单继承。 通过分析提供...
首先,我们使用`getClass()`方法获取当前类的Class对象,然后使用`getGenericSuperclass()`方法获取当前类的父类的Type对象。最后,我们使用`getActualTypeArguments()`方法获取Type对象中的实际类型参数,然后将其...
每个类都包含一系列属性(即变量)和方法(即函数),它们共同定义了一个特定类型的对象的行为和状态。 ##### 2.1 类的定义与结构 一个基本的Java类通常包含以下元素: - **成员变量** (Instance Variables):用于...
DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....
2. 类定义:一个Java源文件可以包含一个公共类和任意数量的非公共类。如果源文件包含一个公共类,那么该文件的名称必须与公共类的名称完全匹配,包括大小写,后缀为`.java`。例如,一个名为`CommonClass.java`的文件...
它可以用来获取当前日期和时间的各种组成部分,并且提供了多种获取时间的方法,例如: - `getDate()`:得到当前日期为这个月的第几天。 - `getDay()`:得到当前日期为这个星期的第几天。 - `getHours()`、`...
在Java编程语言中,类方法是定义...总的来说,这个例子详细地展示了Java中面向对象编程的基本概念,包括类的结构、继承、构造函数、方法的定义与调用,以及对象的实例化和操作。这些都是Java程序员需要掌握的核心技能。
在Java编程语言中,构造方法和普通方法是两种不同的成员函数,它们各自有着特定的用途和规则。构造方法主要用于初始化类的新实例,而普通方法则是完成特定任务的代码块。 构造方法的关键特性包括: 1. **名称匹配*...
1. **获取类信息**:通过`Class`类的`forName()`方法可以获取到任意类的`Class`对象,从而获得该类的完整信息,包括类名、父类、接口、构造器、方法和字段等。 2. **创建对象**:使用`Class`对象的`newInstance()`...
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 在Java中,反射的核心类主要有三个:Class类、Constructor类和Method类。Class类...
每个Java类文件都是以`.class`后缀的二进制文件,它由魔数、版本号、常量池、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合等组成。这些信息定义了类的结构和行为。 2. **...
通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法等,并能够调用类的任意方法。这种能力对于构建高度灵活和可扩展的系统尤为重要。 #### 二、JDK中提供的Reflection API Java反射相关的...
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2. **Class类** `java.lang.Class`代表运行时的类信息,通过`Class.forName()`或...
Java反射是Java语言提供的一种强大的能力,允许程序在运行时检查和操作类、接口、对象以及它们的方法和字段。在上述实例中,我们探讨了如何使用反射来获取一个对象的方法信息。以下是关于Java反射和获取对象方法信息...
本文将详细介绍 Java 中的类和对象的概念、组成部分、声明和实例化。 一、Java 中的类 Java 中的类是一组具有共同特征/行为和共同属性/属性的对象。类不是现实世界的实体,而是创建对象的模板、蓝图或原型。类不...
它通常包含一个或多个抽象方法,以及实现了一些具体的方法和属性。 - **特点**:不能被实例化;可以包含抽象方法(未实现的方法)和具体方法;可以有构造器、属性等。 #### Abstract method (抽象方法) - 抽象方法...
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,它代表了...
通过反射,开发者可以在运行时动态地获取类的结构信息,包括类的名称、属性、方法、构造器以及实现的接口,甚至可以在不预先知道具体类的情况下创建和调用对象。 1. `java.lang.Class`: 这个类是Java反射的起点,它...
在Java中,类是创建对象的蓝图,它包含了数据(即实例变量)和操作这些数据的方法。下面我们将详细探讨这些知识点。 1. **类和对象**:类是对象的模板,定义了对象的状态(实例变量)和行为(方法)。对象是类的...