黑马程序员 反射
来源:互联网 发布:淘宝网1 编辑:程序博客网 时间:2024/06/02 06:37
——- android培训、java培训、期待与您交流! ———-
1,反射概述
其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。
反射就是把Java类中的各种成分映射成相应的java类。
2,Class类描述的信息
类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称列表等等。
String getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类等)名称
Method[] getMethods() 得到自己所有的方法列表
等等
3,获取Class文件对象三种方式
(a)类名.Class (Object类)
(b)对象.getClass() (数据类型)
(c)class.forName (“包名.类名”) (静态方法)
4,预定义Class实例对象
8个基本数据类型:基本数据类型.class
还有 void.class
5,Constructor
实例对象代表某个类中的一个构造方法
(a)得到某个类中所有的构造方法
Constructor< ? > []getConstructors()
(b)得到某个类中的一个构造方法.
Constructor< T > getConstructor(Class< ? >…parameter Types)
参数中传入要获取的构造方法的参数类型的字节码
(c)得到了构造函数的对象,现在要通过构造函数的对象,来创建类的实例对象。
通过Constructor类中的方法
T newInstance(Object… initargs)
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
注意:
(a)得到构造方法时需要参数类型的字节码
(b)调用构造方法时需要参数类型的对象
/* 反射知识中Constructor类演示 */public class ConstructorDemo { public static void main(String[] args) throws Exception { //1.获得一个类的字节码 Class class1 = Class.forName("java.lang.String"); //2.获得这个类的一个构造函数的对象,传入参数的字节码 Constructor constructor = class1.getConstructor(StringBuffer.class); //3.调用newInstance()方法创建类的对象。 String string = (String)constructor.newInstance(new StringBuffer("准备进黑马了")); //结果 System.out.println("字符串中的第三个字符:"+string.charAt(3)); } }
6,Field
Field对象代表某个类中的一个成员变量
获得Fidld对象的方法
Field getField(String name) 返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公共成员字段
Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
Field getDeclaredField(Stringname) 返回一个Field对象,用法和getField()方法一样,但它可以返回私有的成员变量
Field[] getDeclaredFields() 返回Class对象表示的类或接口的所有成员变量,公有私有都返回
暴力反射:
调用Field父类AccessibleObject中的方法:
void setAccessible(boolean flag) 传入true让私有的成员可以被反射
也就是使用setAccessible(true)使private类型的成员变量也可以被获取值
Filed中的方法
Object get(Object obj) 返回指定对象上此Field表示的字段的值
void set(Object obj, Objectvalue) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
7,Method
实例对象代表某个类中的某个方法
获取Method对象的方法
Method getMethod(String name , Class< ? > … prameterTypes)
name是方法名,prameterTypes是方法的参数的字节码
Method[] getMethods() 获取类中所有公有方法和父类中的方法的集合
Method[] getDeclaredMethods() 获本类中所有方法,不管是公有还是私有
通过Method类中的 方法
Object invoke(Object obj , Object… args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
obj为使用这个方法的对象,args为要传入的参数
注意:
当invoke方法传入的第一个参数为null,说明这个方法是静态方法, 因为不需要对象来调用
/* 演示Method类中方法, Person类省略。 */ public class MethodDemo { public static void main(String[] args)throws Exception { //创建Person类对象 Person person = new Person("赵六", 26); //获取person对象的字节码,调用getMethod方法 //由于toString方法不用传入参数,所以第二个参数为null Method methodToString = person.getClass().getMethod("toString", null); //使用invoke方法调用获取到的方法,person对象调用,不用传入参数 System.out.println(methodToString.invoke(person, null)); } }
8,数组与Objcet的关系及其反射类型
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
Class类中有一个方法Class< ? super T > getSuperclass() 返回这个方法的父类的字节码
通过数组的字节码调用此方法,得到的是Object的字节码。
数组的父类是Object,Array是Object的子类
注意:
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
- 黑马程序员--java 反射
- 黑马程序员之反射
- 黑马程序员之反射
- 黑马程序员__java_反射
- 黑马程序员_反射
- 黑马程序员 反射
- 黑马程序员--Java反射
- 黑马程序员--反射
- 黑马程序员-java-反射
- 黑马程序员:反射技术
- 黑马程序员_java反射
- 黑马程序员---反射
- 黑马程序员-反射
- 黑马程序员---反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员:反射
- 黑马程序员_反射
- NIO(JDK1.4)--缓冲区
- 剑指offer:3-二维数组中的查找
- 理解HotSpot的CMS GC
- Objective-C中不同方式实现锁(一)
- centos7 lamp环境配置及多域名设置
- 黑马程序员 反射
- CCF 201312-1出现次数最多的数
- HDU 2689 Sort it(树状数组求逆序数)
- js 判断文件是否存在
- Perforce初体验
- 纯CSS分页代码
- mongoDB分片集群常用指令
- Android 问题之找不到资源解决办法
- HDU 1071 The area(数学 抛物线 积分)