Java反射(二)利用反射分析类的能力
来源:互联网 发布:淘宝店铺中差评的修改 编辑:程序博客网 时间:2024/04/28 08:08
利用反射分析类能力的类的源码如下(来源于《Java核心技术》卷一):
package testreflection;import java.util.*;import java.lang.reflect.*;/** * 这个类利用反射打印出一个类的所有特征 * * @version 1.1 2004-02-21 * @author Cay Horstmann */public class ReflectionTest {public static void main(String[] args) {// 从命令行参数或者用户输入读取一个类名String name;if (args.length > 0)name = args[0];else {Scanner in = new Scanner(System.in);System.out.println("Enter class name (e.g. java.util.Date): ");name = in.next();}try {// 打印类名和超类名(如果超类不是Object的话)Class cl = Class.forName(name);Class supercl = cl.getSuperclass();// 获得类或接口的修饰符,不过是这个修饰符被编码后的整数int mi = cl.getModifiers();System.out.println(mi);// 获得整数代表的实际的修饰符String modifiers = Modifier.toString(mi);System.out.println(modifiers);if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print("class " + name);if (supercl != null && supercl != Object.class) {System.out.print(" extends " + supercl.getName());}System.out.print("\n{\n");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 打印一个类的所有构造器 * @param cl a class */public static void printConstructors(Class cl) {/** * Constructor类用于描述类的构造器; * cl.getDeclaredConstructors()返回类中声明的全部 * 构造器,不包括父类中的 */Constructor[] constructors = cl.getDeclaredConstructors();for (Constructor c : constructors) {// 获得构造器名字String name = c.getName();System.out.print(" ");// 获得构造器的描述符String modifiers = Modifier.toString(c.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print(name + "(");// 打印参数类型列表Class[] paramTypes = c.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0) {System.out.print(", ");}System.out.print(paramTypes[j].getName());}System.out.println(");");}}/** * 打印一个类的所有方法 * @param cl a class */public static void printMethods(Class cl) {/** * Method类用于描述类的方法; * cl.getDeclaredMethods()返回类中声明的全部方法, * 不包括父类中的 */Method[] methods = cl.getDeclaredMethods();for (Method m : methods) {// 获得描述返回类型所属类型的Class对象Class retType = m.getReturnType();// 获得方法名String name = m.getName();System.out.print(" ");// 打印修饰符,返回类型和方法名String modifiers = Modifier.toString(m.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print(retType.getName() + " " + name + "(");// 打印参数类型列表Class[] paramTypes = m.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0) {System.out.print(", ");}System.out.print(paramTypes[j].getName());}System.out.println(");");}}/** * 打印一个类的所有域 * @param cl a class */public static void printFields(Class cl) {/** * Field类用于描述类的域; * cl.getDeclaredFields()返回类中声明的全部域, * 不包括父类中的 */Field[] fields = cl.getDeclaredFields();for (Field f : fields) {// 获得描述域所属类型的Class对象Class type = f.getType();// 获得域的名字String name = f.getName();System.out.print(" ");// 获得域的描述符String modifiers = Modifier.toString(f.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.println(type.getName() + " " + name + ";");}}}
这里有一个待分析的类:
package testreflection;public class Student extends Person {private static int count;private String stuNum;public Student() {super();// TODO Auto-generated constructor stubcount++;}public Student(String name, int age, boolean gender, String stuNum) {super(name, age, gender);// TODO Auto-generated constructor stubthis.stuNum = stuNum;count++;}public String getStuNum() {return stuNum;}public void setStuNum(String stuNum) {this.stuNum = stuNum;}public static int getCount() {return count;}}
Student类的父类Person类的源码如下:
package testreflection;public class Person {private String name;private int age;private boolean gender;public Person() {// TODO Auto-generated constructor stub}public Person(String name, int age, boolean gender) {super();this.name = name;this.age = age;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isGender() {return gender;}public void setGender(boolean gender) {this.gender = gender;}}
利用ReflectionTest类分析Student类的结果如下:
1
public
public class testreflection.Student extends testreflection.Person
{
public testreflection.Student();
public testreflection.Student(java.lang.String, int, boolean, java.lang.String);
public static int getCount();
public void setStuNum(java.lang.String);
public java.lang.String getStuNum();
private static int count;
private java.lang.String stuNum;
}
0 0
- Java反射(二)利用反射分析类的能力
- 利用java反射分析类的能力
- 利用反射分析类的能力,使用反射分析对象
- Java利用反射机制分析类的能力
- Java中的反射(2)——利用反射分析类的基本能力
- 反射+Class类方法_利用反射分析类的能力
- Java反射(二):反射的使用
- 利用反射分析类
- 利用反射,分析类
- core java 例题 利用反射分析类
- 利用反射机制分析类 | Java基础
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java的反射(二)
- 利用反射分析类的内部数据
- java--类反射(二)
- Java类反射(能力更上一台阶,Java跳跃)
- java反射(二)
- UVaLive 2995 Image Is Everything 立方体成像
- 物联网系统的搭建(十)
- JavaSE笔记之<访问权限控制深入>
- 《C#程序设计》第五次作业
- To_review_100_5---Karp Rabin算法的整理
- Java反射(二)利用反射分析类的能力
- IOS--C 语言 Lesson Seven 指针函数
- 黑马程序员--c语言各种运算
- Git仓库完全迁移,包括所有的分支和标签
- 学习笔记:axure 高级教程 5Axure产品原型在手机上如何运行
- 模拟 安卓 Toast 提示, CSS3 19种特效随意挑
- LINUX当前目录下的文件夹大小
- MyEclipse 安装findbugs插件
- 关于OpenNebula/one 报 information driver的问题