程序运行时,允许改变程序结构或变量类型的,这种语言称为动态语言。
例如javascript
var i = 1;
i = "abc";
i = false;
从这个观点来看,java属于静态语言,但java却有着一个非常突出的动态机制:Reflection。
java反射机制是在运行(而非编译时)态中,对于任意一个类,都能够知道这个类的所有属性和方法(包括私有);对于任意一个对象,都能调用它的任意一个方法或属性(包括私有)。这就说明了Java在一定程度上破坏了类的封装性。
Java 反射机制主要用到的类:
- Class:代表一个类。
- Field:代表类的成员变量(成员变量也称为类的属性)。
- Method:代表类的方法。
- Constructor:代表类的构造方法。
- Array:提供了动态创建数组,以及访问数组的元素的静态方法。
下面通过上面的类获得简单类的所有属性和方法:
Person.java(最好自己定义无参构造方法)
public class Person {
public String name;
private Integer age;
public Person() {}
public Person(String name, Integer age){
this.name = name;
this.age = age;
}
public void getException() throws Exception, RuntimeException{}
//下面是setter,getter
}
Main.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* 打印这个类具有的方法信息
* @author WalkingDog
*
*/
public class Main {
public static void main(String[] args) throws Exception {
Class<?> type = Class.forName("Person");
System.out.print(Modifier.toString(type.getModifiers()) + " ");
//这里只是单纯地判断是否Interface或class,还有其它的例如Enum,LocalClass,Synthetic等
System.out.print(type.isInterface() == true ? "interface " : "class " );
//getSimpleName()获取名字,不包括路径,getName()获得完整名字
System.out.println(type.getSimpleName() + "{");
System.out.println();
//属性
//getDeclareFields()获得所有属性,getFields()获得public属性
Field[] fields = type.getDeclaredFields();
for(Field field : fields){
//获取修饰符
System.out.print("\t" + Modifier.toString(field.getModifiers()) + " ");
System.out.println(field.getType().getSimpleName() + " " + field.getName() + ";");
}
System.out.println();
//构造器
Constructor<?> constructors[] = type.getDeclaredConstructors();
for(Constructor<?> constructor : constructors){
System.out.println("\t" + constructor + "{}");
}
System.out.println();
//方法
Method[] methods = type.getDeclaredMethods();
for(Method method : methods){
System.out.print("\t" + Modifier.toString(method.getModifiers()) + " ");
System.out.print(method.getReturnType().getSimpleName() + " " + method.getName() + "(");
Class<?> parameters[] = method.getParameterTypes();
for(int i = 0; i < parameters.length; i++){
System.out.print(parameters[i].getCanonicalName() + " arg");
if(i < parameters.length - 1)System.out.print(", ");
}
System.out.print(")");
//获取异常信息
Class<?> exceptions[] = method.getExceptionTypes();
if(exceptions.length > 0)System.out.print(" throws ");
for(int i = 0; i < exceptions.length; i++){
System.out.print(exceptions[i].getCanonicalName());
if(i < exceptions.length - 1)System.out.print(", ");
}
System.out.println("{}");
}
System.out.println("}");
}
}
结果:
public class Person{
public String name;
private Integer age;
public Person(){}
public Person(java.lang.String,java.lang.Integer){}
public Integer getAge(){}
public void setAge(java.lang.Integer arg){}
public String getName(){}
public void getException() throws java.lang.Exception, java.lang.RuntimeException{}
public void setName(java.lang.String arg){}
}
转载请注明出处:http://blog.csdn.net/vipwalkingdog/article/details/7681366