程序运行时,允许改变程序结构或变量类型的,这种语言称为动态语言。
例如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