Java反射之初识

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

你可能感兴趣的:(java,exception,String,Integer,Parameters,Constructor)