黑马程序员——java反射

反射概述:

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
Java反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的成员变量和方法
生成动态代理

一、class类
在Object类中定义了以下的方法,此方法将被所有子类继承:
public final Class getClass()
以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。


对照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class本身也是一个类
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
一个Class对象对应的是一个加载到JVM中的一个.class文件
每个类的实例都会记得自己是由哪个 Class 实例所生成
通过Class可以完整地得到一个类中的完整结构

反射:在运行时动态分析或使用一个类进行工作。

         java.lang.Class类:描述类信息的类。

         类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。

        

         获得类对象的方式:

                  用" 类名.class"获得这个类的类对象。

                  用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。

                  可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。

                  基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。

 

         java.lang.reflect包下的三个重要类:

                  Field属性类:用来描述属性的信息。

                  Method方法类:方法的信息的描述。

                  Constructor构造方法类:用来描述构造方法的信息。

 

         Class类中的常用方法:

                  newInstance()

                           创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。

                  getDeclaredMethods()

                           获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。

                  getMethods()     //推荐使用

                           获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。

                  getDeclaredConstructors()

                           获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。

                  getConstructors()    //推荐使用

                           获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。

                  getDeclaredFields()    //推荐使用

                           获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。

                  getFields()

                           获得的是一个Field属性类对象的数组,获得所有publice的属性对象。

                          

         使用反射构造一个类的对象的步骤:

                  a. 获得类对象

                  b. 获得构造方法对象

                  c. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,可以跳过第二步,直接使用" 类对象.newInstance() "方法来获得这个类的对象

                  d. 获得方法对象

                  e. 用方法对象调用方法(用这个类的对象作为第一参数)

                  如下面的例子:

                           反射机制的实现类:

				import java.lang.reflect.Field;
				import java.lang.reflect.Method;
				import java.util.HashMap;
				import java.util.Map;
				import java.util.Set;			
				public class TestReflect {					
					public static Object get(String className , Map<String,Object> map) throws Exception{
						Class c = Class.forName(className);                  //获得类对象
						Object o = c.newInstance();                   //获得对象
						Set<String> set = map.keySet();
						for(String str : set){
							String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);
							Field f = c.getDeclaredField(str);
							Method m = c.getMethod(s, f.getType());        //获得方法对象
							m.invoke(o, map.get(str));                       //用方法对象调用方法
						}
						return o;
					}
					
					public static void main(String[] args) throws Exception {	
						Map m = new HashMap();
						m.put("name", "zhang");
						m.put("age", 22);
						Object o = get("day07.reflect.Student",m);
						Student s = (Student) o;
						System.out.println(s.getName() + "   " + s.getAge());
						
						Map m1 = new HashMap();
						m1.put("name", "li");
						m1.put("gender", "男");
						Object o1 = get("day07.reflect.Teacher",m1);
						Teacher t = (Teacher) o1;
						System.out.println(t.getName() + "    " + t.getGender());
					}
				}
			//学生类
				package day07.reflect;				
				public class Student {
					private String name;				
					private int age;				
					public int getAge() {
						return age;
					}				
					public void setAge(int age) {
						this.age = age;
					}				
					public String getName() {
						return name;
					}				
					public void setName(String name) {
						this.name = name;
					}
				}	
			//教师类
				package day07.reflect;				
				public class Teacher {
					private String name;				
					private String gender;				
					public String getGender() {
						return gender;
					}				
					public void setGender(String gender) {
						this.gender = gender;
					}						
					public String getName() {
						return name;
					}				
					public void setName(String name) {
						this.name = name;
					}				
				}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值