黑马程序员_Java反射机制

                                                                   ---------------------- android培训java培训、期待与您交流! ----------------------

Java反射机制是在运行状态中对于任意一个类都能知道这个类的所有属性和方法;

对于任意一个对象都能够调用它的任意一个方法和属性
这种动态获取的信息以及动态调用对象的方法的功能称之为Java语言的反射机制。
简单说:其实反射就是动态对一个类的内容进行获取并使用
其实就是对指定类的解剖
反射机制提高了程序的拓展性
----------------------------------
代码示例讲解:
-->获取字节码文件对象
	public static void main(String[] args) throws Exception {
		/*
		 * 获取字节码文件对象
		 * 三红方式:
		 * 1.getClass()方法
		 * 但是必须要明确具体的类,而且要通过该类创建对象用对象

的方法才可以获取
		 * 2.每一个数据类型都有一个静态属性class
		 * 每一个类型都对应的自己的Class类型的对象
		 * 虽然不用在创建对象了,但是还是要先明确该类在调用其静

态的的属性完成
		 * 
		 * 也就是说前两种方式都必须要有声明的具体的类,而且还要

调用方法或者属性才可以完成
		 * 
		 * 3.使用的是Class类中的ForName方法根据指定的类名来获取

其中的字节码文件对象
		 * 只需要一个类名字符串即可,forName方法自动会根据指定的

字符串名称去查找对应的类文件。
		 * 如果找到就将其类加载到内存并分装成字节码文件对象
		 * 否则就抛出ClassNotFoundException异常
		 * 
		 * 因为第三种只需要字符串名称所以拓展性很强
		 * 以这种方式为主提高程序的可以拓展性
		 */
		
		getClassObejct();
		
	}

	private static void getClassObejct() throws Exception {
		Class myClass=Class.forName("entity.Person");
		System.out.println(myClass);
	}
-->字节码对象得到了 下面就要对象的创建初始化
		public static void main(String[] args) throws Exception, 

Exception, Exception {
		/*
		 * 获取的指定类的Class那么也可以去实例化对象
		 * 实例化对象就需要构造函数 构造 构造函数有两种情况 
		 * 第一种情况是空参数的构造器
		 *
		 */
		createConstructor_Method();
		/*
		 * 第二种情况就是有构造函数:
		 * 既然要根据指定的构造函数进行初始化
		 * 就必须要先获得要初始化对象的构造函数
		 * 再通过该构造函数进行对象创建的初始化
		 * 
		 */
		createConstructor_method2();
		
	}

	private static void createConstructor_method2() throws Exception 

{
		String className="entity.Person";
		Class MyClass=Class.forName(className);
		//获取指定参数的构造函数是由Class对象来完成的
		Constructor constructor=MyClass.getConstructor

(String.class,int.class);
		//通过Class对象指定的构造函数进行对象创建的初始化传递指

定的实际参数
		Object obj=constructor.newInstance("李四",23);
	}

	private static void createConstructor_Method() throws 

ClassNotFoundException, Exception, IllegalAccessException {
		Class myClass=Class.forName("entity.Person");
		Object obj=myClass.newInstance();//该方法是用的就是类中

的无参构造进行初始化对象
	}
-->对象创建完了下面得到的是字段
	public static void main(String[] args) throws Exception {
		/*
		 * 获取Class中的成员字段
		 */
		getFieldMethod();
	}

	private static void getFieldMethod() throws Exception {

		String className="entity.Person";
		Class MyClass=Class.forName(className);
		Object obj=MyClass.newInstance();
		/*
		 * 获取该类中的私有age字段
		 * Field field=MyClass.getFi("age");该方法只能获取共有的

字段
		 * 如果想获取私有字段那么就必须使用getDeclaredField()
		 */
			Field field=MyClass.getDeclaredField("age");
			//设置取消队成员的访问控制检查的能力的方法。
			field.setAccessible(true);//暴力访问对象
			field.set(obj, 24);//obj=所属对象,24=给当前获取

的age字段的属性值
			Object value=field.get(obj);//获取字段的值
			System.out.println(value);
		
	}
-->字段得到了下面就是成员方法
	public static void main(String[] args) throws Exception {
//		Class MyClass=Class.forName("entity.Person");
//		Object obj=MyClass.newInstance();
		/*
		 * 获取一个空参数的共有权限方法(方法是属于类的跟对象无关

)
		 * Method method=MyClass.getMethod("pubMethod", null);
		 * 但是运行就跟对象有关了
		 * method.invoke(obj, null);-->obj=所属对象,null 无参数
		 */
		//获取有参数的public方法
//		Method method=MyClass.getMethod("paramMethod", 

String.class,int.class);
//		method.invoke(obj, "lixiao",24);
		//获取私有 带参方法
//		DeclareedMethod("方法名",参数类型)
//		Method method=MyClass.getDeclaredMethod("paramMethod", 

String.class,int.class);
//		method.setAccessible(true);
//		method.invoke(obj, "san",34);
		//获取所有的方法
		getAllMethod();
		
		
	}

	private static void getAllMethod() throws Exception {
		String className="entity.Person";
		Class MyClass=Class.forName(className);
		Object obj=MyClass.newInstance();
//		Method[] methods=MyClass.getMethods();//获取父类(Object)

中的方法
		Method[] methods=MyClass.getDeclaredMethods();//获取本类

中的方法只限于本类
		for (Method method : methods) {
			System.out.println(method);
		}
	}


                           ---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值