Java反射机制

Class类
自定义一个Java Bean User类,以此类作为操作对象;

//	test是User类的一个实例对象,
//	其实User类也是一个实例对象,是Class类的实例对象
User test = new User();

// clazz1、clazz2、clazz3都表示User类的类类型(class type)
Class clazz1 = User.class;
Class clazz2 = test.getClass();
Class clazz3 = null;
try {
	clazz3 = Class.forName("com.zm.User");
} catch(Exception e) {
	e.printStackTrace();
}
System.out.println(clazz1 == clazz2);		// true
System.out.println(clazz1 == clazz3);		// true

// 可以通过该类的类类型创建的该类的对象实例,前提是该类由无参构造函数
try {
	User user = (User) clazz1.newInstance();
} catch(Exception e) {
	e.printStackTrace();
}

其他
获取类成员变量、方法、构造函数的类方法基本类似

Class clazz = object.getClass();
// 该方法用于获取包含继承过来的所有类的public方法
 Method[] methods1 = clazz.getMethods();
 // 该方法用于获取所有该类的方法,不包含继承来的方法
  Method[] methods2 = clazz.getDeclaredMethods();

上面两个获取类方法的途径对获取成员变量和构造函数是类似的。

 for (Method each : methods2) {
	// 获取类方法的返回值类型
	Class returnType = each.getReturnType();
	// 获取类方法的参数列表
	Class[] paraClasses = each.getParameterTypes();
	// 获取类方法的访问权限
	each.getModifiers()
}

通过Java的反射机制可以获取到其他信息,有兴趣的可以自己去看看内部的API。

常用实践

public void fun() {
	ArrayList list1 = new ArrayList();
	list1.add("China");
	// list1.add(100); 编译时会提示错误
	ArrayList list2 = new ArrayList();
	
	Class clazz1 = list1.getClass();
	Class clazz2 = list2.getClass();
	System.out.print(clazz1 == clazz2);	//  true

	try {
			Method m = clazz1.getMethod("add", Object.class);
			m.invoke(list1, 100);
			System.out.pringln(list1); 	// [China, 100]
		} catch (Exception e) {
		e.printStackTrace();
	}

从上面的例子可以看出:

  • clazz1等于clazz2可以说明编译之后集合的泛型是不起作用,是去范型化的;
  • Java集合的泛型是防止错误输入的,只在编译阶段有效,而通过反射机制来进行的操作都是在运行阶段执行的,体现了运行阶段集合的泛型是无效的;

你可能感兴趣的:(Java)