您的位置:首页 > 编程语言 > Java开发

Java反射机制-Class类获取类信息

2011-02-22 13:36 309 查看
1.什么是Java反射?

Java的反射是指通过一个已知类名就可以获取到该类的内部信息,如类的成员变量,方法,构造函数,而且可以通过反射动态的调用该对象的方法,假设我们有这样一个类

package com.crazycoder2010.reflect;

public class Demo {

private String strField;
protected Integer intField;
public double doubleField;
float floatField;
public static final Object DEMO = new Object();
public Demo(){
}
private Demo(float floatField){
this.floatField = floatField;
}
public Demo(String strField){
this.strField = strField;
}
public Demo(Double doubleField)throws IllegalArgumentException{
this.doubleField = doubleField;
}
public void sayHello(String word){
System.out.println("Hello "+word);
}
}

2.通过反射机制都能作什么操作?

2.1获取类的成员变量

我们来写这样一个方法来获取一下

private static void showFields() throws SecurityException, NoSuchFieldException {

Class<?> demo = Demo.class;
//这里能获取到的只有那些public 类型的field,开来还是要多看API,多实践,以前以为是所有的字段都可以的:)
//这个fields获取的只有两个值doubleField和DEMO
Field[] fields = demo.getFields();
for (Field field : fields) {
System.out.println("成员变量-"+field.getName());//这里很简单就是字段的名称doubleField
System.out.println("修饰符-"+field.getModifiers());//这个打印出来的是数字,搞成枚举更直接些,可能是java1.5之前不支持枚举,看数字再去对比Modifer类太头大了
System.out.println("字段声明类的类型-"+field.getDeclaringClass());//这个类没有继承关系,所以是com.crazycoder2010.reflect.Demo
System.out.println("字段类型-"+field.getGenericType());//获取该字段的类型
System.out.println("**************************");
}
}

2.2获取类的构造函数

private static void showConstructors() {

Class<?> demo = Demo.class;
Constructor<?>[] constructors = demo.getConstructors();//这里能获取到的列表也是public的
for(Constructor<?> constructor : constructors){
System.out.println("名称-"+constructor.getName());
if(constructor.getExceptionTypes().length>0){//判断一下构造函数中是否有异常抛出
StringBuilder str = new StringBuilder("抛出异常-{");
for(Class<?> e:constructor.getExceptionTypes()){
str.append(e.getName());//异常类的名称
str.append(" ");
}
str.append("}");
System.out.println(str.toString());
}
System.out.println("修饰符-"+constructor.getModifiers());
if(constructor.getParameterTypes().length>0){//构造函数的参数打印出来
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("构造函数参数列表-{");
for(Class<?> t : constructor.getParameterTypes()){
stringBuilder.append(t.getName()).append(" ");
}
stringBuilder.append("}");
System.out.println(stringBuilder);
}else{
System.out.println("默认构造函数");
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}
}

2.3获取方法

private static void showMethods() {

Class<?> demo = Demo.class;
Method[] methods = demo.getMethods();
for(Method m : methods){
System.out.println("方法名-"+m.getName());
System.out.println("修饰符-"+m.getModifiers());
if(m.getParameterTypes().length>0){
StringBuilder stringBuilder = new StringBuilder("参数列表-{");
for(Class<?> p : m.getParameterTypes()){
stringBuilder.append(p.getName()).append(" ");
}
System.out.println(stringBuilder.append("}"));
}
System.out.println("方法返回类型-"+m.getReturnType());
System.out.println("抛出异常个数-"+m.getExceptionTypes());
System.out.println("###############################");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: