学习分享
最坏的习惯,是苟安于当下的生活,不知道明天的方向
什么是反射机制
反射机制是在运行状态中,对任意个类,都能知道这个类的所有属性,方法;对于任意一个对象,都能够动态调用它的任意一个方法和属性;这种动态获取信息以及动态调用的功能称之为JAVA的反射机制;
总结:
a. 动态获取类的描述;例如动态的获取类的名字,包名,构造器,方法,字段
b. 动态的调用对象的方法和属性; 例如输入什么方法名就调用对象的什么方法
java.lang.Class
Class 是反射的核心类,是故事的起源 反射就像镜子,映出类的描述
什么是Class
任意类都有一个Class类型的对象与之对应; 这个Class类型的对象描述着这个类
// 第一种方式, 通过类名.class 属性
Class c1 = Student.class;
// 第二种方式, 通过对象.getClass 方法
Class c2 = new Student().getClass();
// 第三种方式, 通过Class.forName("包名.类名")
Class c3 = Class.forName("com.panshi.Student");
// 打印信息
System.out.println(c1 + " :" + c1.getName());
System.out.println(c2 + " :" + c2.getName());
System.out.println(c3 + " :" + c3.getName());
总结:
1.任意类有且仅有一个class对象
2.class对象描述着这个类
通过class对象获取指定类的描述信息
// 获取构造器
getConstructors(); // 获取所有构造器 (只能访问public 修饰)
getDeclaredConstructors(); // 获构造器 (可以访问到非public修饰)
getConstructor(Class>... parameterTypes); // 获取指定构造器
getDeclaredConstructor(Class>... parameterTypes);
// 获取字段
getFields();
getDeclaredFields();
getField(String name);
getDeclaredField(String name);
// 获取定义的方法
getMethods()
getDeclaredMethods()
getMethod(String name, Class>... parameterTypes)
getDeclaredMethod(String name, Class>... parameterTypes)
java.lang.reflect.Constuctor
是什么
构造器的描述对象,描述着指定类的构造器
能做什么
允许通过其newInstance()方法来创建对象的实例
反射创建对象实现步骤:
第一步:获取class对象
Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述
第二步:通过class对象获取到其构造器描述
Constructor constructor = clazz.getConstructor([参数类型列表]);
第三步:调用构造器描述的newInstance来创建实例对象
Foo foo = constructor.newInstance([参数列表]);
无参构造器实例化(简化)(调用无参构造器实例化)
Class clazz = Foo.class;
Foo foo = clazz.newInstance();
java.lang.reflect.Method
是什么
方法的描述对象,描述着指定类的方法
能做什么
允许通过invoke()方法来动态调用对象
反射调用方法实现步骤
第一步: 获取class对象
Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述
第二步: 通过class对象获取到指定的方法描述
Method method = clazz.getMethod("setName", String.class);
第三步: 反射调用
method.invoke(foo,"小明"); // 等同于 foo.setName("小明");
java.lang.reflect.Field
是什么
提供有关类或接口的单个字段的信息
能做什么
允许通过get,set方法来动态取值,设值
实现步骤
第一步: 获取class对象
Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述
第二步: 通过类描述获取到字段描述
Field field = Class.getField("name");
第三步: 反射调用
field.set(foo, "小明"); // 等同于 foo.name = "小明";
Object value = field.get(foo); // 等同于 Object value = foo.name;
本网站属于个人的非盈利性网站、博客,主要是一些学习过程中的一些心得分享和笔记,同时可能存在部分非私人原创撰写的文章,由于在过程中浏览过别人分享于本人的资源,可能一些源自于网络,亦可能误摘抄他人分享转载的文章,按照目前互联网开放的原则,将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,被本人误载入,非常抱歉,请务必来信告知:miku109040azusa@vip.qq.com
© 2016-2017 Build by Chen | WinterSakura.COM 粤ICP备17119124号