Java反射之初识

7 篇文章 0 订阅
5 篇文章 0 订阅

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值