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;
}
}
分享到:
相关推荐
DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....
一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...
•在定义接口时,接口里可以包含成员变量(只能是常量),方法(只能是抽象实例方法、类方法或默认方法),内 部类(包括内部接口、枚举类 –常量都是:public static final修饰 –方法都是:public abstract ...
(6) 类体包含了变量和方法。在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义了一个 Point 类 ,并且声明了它的两个变量 x、y 坐标 ,同时实现 init()方法 对 x、y ...
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...
对象可以包含任意数量和类型的数据。 python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。 在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object...
静态方法可以是泛型方法(在修饰符和返回值之间写泛型),但是不可以使用类的泛型。 static void copyArrayToList(Object[] os,List<T> ls){ //错误,T为类的泛型 } static <E> void ...
String getName() 获取全限定类名(全限定,包含包名) Class类中方法 String getSimpleName() 获取类名简称 Class类中方法 Package getPackage() 获取包名 Class类中方法 T newInstance() ...
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...
C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...
Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...
Java实现文字随意拖动,随处拖动文本字符,移动到任意位置,super("文本的拖动处理"); //调用父类构造函数 String[] data = {"one", "two", "three", "four"}; //字符数组,用于构造列表框 DragList list=new...
第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 77 6.1.1 面向对象程序设计思想的诞生 77 6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建...
Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,...
开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...
对 C++ 来说,前面例子中 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using ...
该程序能够实现图片的任意拖动。部分代码如下: super("图片的拖动效果"); //调用父类构造函数 Icon image=new ImageIcon(this.getClass().getResource("1.jpg")); //实例化图标 jlPic = new JLabel(image); //...