什么是java反射机制

    .反射的概念是有Smith在1982年提出来的,主要是指程序可以访问,检测,和修改它本身状态的一种能力

    .java反射机制是在运行状态中,对于任意一个类,都能知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个方法,这种动态获取的信息以及动态调用对象的方法的功能称为java语言反射机制。

    .通常情况下我们通过new object 来生成一个类的实例,但有时候我们没有办法直接new,只能通过反射动态生成

    eg:给一个jar包,在这里里边你知道有一个类,但是不知道怎么实例化,或者没有访问权限。 

    给一个栗子:

其中类UserInfo中包含了UserName,passwd,UerNo三个属性

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Ref0Test {

	
	public static void main(String[] args) {
		
		try {
			Class cls = Class.forName("com.zzxtit.mvc.stu.entity.UserInfo");//获取这个类
			//此处就开始通过映射来实例化对象
			Object obj = cls.newInstance();     //创建这个类的对象obj以为不知道是什么类型,所以创建为object
			
			Method method = cls.getMethod("toString", null);//获取类中的toString方法
			
			Method method0 = cls.getMethod("setUserName", String.class);  //String.class为参数
			
			//Field field = cls.getField("passwd");   
			//field.set(obj, "1345646784168");
			for(Field field : cls.getDeclaredFields()){    // .getfiled获取属性,用循环来遍历所有属性
//				System.out.println("--------------------------->" + field);
				if("passwd".equals(field.getName())){
					field.setAccessible(true);       //此处涉及强制修改private属性值;
					field.set(obj, "123456");
				}
			}
			
			//用method.invoke调用方法
			method0.invoke(obj, "**");
			//调用此方法
			System.out.println("=======================>" + method.invoke(obj, null) );
		
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} 					
	}
}

实例化无参构造函数的对象,两种方式:

(1)Class.newInstance();

  (2) Class.getConstructor(new Class[]{}).newInstance(new Object[]{})

实例化到参构造函数的对象:

class.getConstructor(Class<?>...parameterTypes).newInstance(Object...instargs)

扫描二维码关注公众号,回复: 2706860 查看本文章


.只要用到反射,先获得Class Object

.没有方法能获得当前超类的private方法和属性,你必须通过getSuperclass()找到超类以后再尝试获得

.通常情况下即使是当前类private属性和方法也是不能访问的,你需要设置权限setAccessible(true)来取得private的访问权,但是这已经破坏了面向对象的规则,所以除非万不得已否则尽量少用



猜你喜欢

转载自blog.csdn.net/Maybeno1314/article/details/80381561