Java反射

反射:
加载类:Class.forName("类名");

1、反射是什么

2、反射做什么
类加载时首先加载到内存当中,然后产生一个Class类对象,一个类的Class对象只有一个
类模板对象:Class:专门装载(记录)类的信息,以对象的方式存放,JVM使用,只被加载到Class对象一次。
3、反射与动态多态的关系

类模板对象只有一个
实例对象可以有无数个(new Student())

连接:把类的二进制数据合并到JRE中
初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化

反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。

反射机制API:运行时探究和使用编译时未知的类

反射使用步骤:
1、获得你想操作的类的java.lang.Class 对象(3种方式获取)
1、调用实例对象继承于Object的getClass()方法
1、可以的到所有类和数组的Class对象
2、虽然可以得到Class对象,但是没有编译时未知,运行时探究的动态效果
2、利用语法:类型名.class的方式获取到Class对象
1、所有类型(不管是基本数据类型还是引用数据类型,甚至是返回类型void)都可以得到相应的Class对象
(基本数据类型.class只能在JDK1.5以后使用 JDK1.5之前获取基本数据类型的Class对象:包装类.TYPE)
2、虽然可以得到Class对象,但是没有编译时未知,运行时探究的动态效果
3、利用Class.forName("字符串形式的类型名");获取Class对象:(动态加载) Class.forName:加载完毕交给虚拟机
1、不支持基本数据类型、返回类型void和数组获取相应的Class对象
2、拥有编译时未知,运行时探究的动态效果

2、(探究类的信息)属性、构造、方法


1、探究类的基本声明部分:
Class对象.getPackage().getName(); 包全名
Class对象.getName(); 类全名、类的限定名
Class对象.getSimpleName(); 得到类名
Class对象.getModifiers(); 得到修饰符(访问修饰符+可选修饰符) 返回int
Modifier.toString(int); 使用工具类把int类型修饰符表示转换为字符串的修饰符表示
Class对象.getSuperclass(); 得到父类Class对象
Class对象.getInterfaces(); 得到Class对象数组(因为类可以多实现接口)
2、探究属性 Field对象:
Class对象.getFields(); 得到所有的公共属性(包括父类继承而来的公共属性) 返回一个Field [];
Class对象.getField("属性名"); 得到指定的公共属性(包括父类继承而来的公共属性) 返回一个Field
Class对象.getDeclaredFields(); 得到所有声明的属性(不包括来自父类的) 返回一个Field [];
Class对象.getDeclaredField("属性名"); 得到指定的声明属性(不包括来自父类的) 返回一个Field;

Field.getName(); 属性名
Field.getType(); 属性类型,返回Class,再调用Class的getSimpleName()得到类名
Modifier.toString(Field.getModifiers); 修饰符




3、探究构造:Constructor对象:
Class对象.getConstructors(); 得到所有的公共构造 返回一个Constructor [];
Class对象.getConstructor(); 得到指定公共构造 返回一个Constructor;
Class对象.getDeclaredConstructors(); 得到所有声明的构造 返回一个Constructor [];
Class对象.getDeclaredConstructor(参数列表); 得到指定声明构造 返回一个Constructor;

Modifier.toString(Constructor对象.getModifiers); 修饰符
Constructor对象.getName() 方法名 -- 真正的构造方法名就是类全名
Constructor对象.getParametersTypes(); 形参列表 返回Class [] , 再调用Class的getSimpleName()得到类名
Constructor对象.getExceptionTypes(); 抛出的异常 返回Class [],再调用Class的getSimpleName()得到类名
4、探究方法:Method对象:
Class对象.getMethods(); 得到所有的公共方法 返回一个Method [];
Class对象.getMethod(); 得到指定公共方法 返回一个Method;
Class对象.getDeclaredMethods(); 得到所有声明的方法 返回一个Method [];
Class对象.getDeclaredMethod(方法名 , 参数列表); 得到指定声明方法 返回一个Method;

Modifier.toString(Method.getModifiers); 修饰符
Method对象.getName() 方法名
Method对象.getReturnType() 返回类型
Method对象.getParametersTypes(); 形参列表 返回Class [] , 再调用Class的getSimpleName()得到类名
Method对象.getExceptionTypes(); 抛出的异常 返回Class [],再调用Class的getSimpleName()得到类名

3、使用探究到的类的信息
1、使用反射创建对象 -- Java中第三种创建对象的方式
1、根据探究到的Constructor对象,产生实例对象
好处:可以调用任意构造方法
坏处:实现过去麻烦
Constructor对象 . newInstance(实参列表); 这个方法在反射中用来产生实例对象的 返回一个Object对象 (受访问修饰符的限制)
Constructor对象 . setAccessible(true); 设置这个构造方法对象的访问权限为可访---不到万不得已不准用!
2、直接利用Class对象产生实例对象
好处:代码简洁
坏处:只能调用公共无参构造
Class对象 . newInstance(); 产生实例对象

2、操作属性:
得到属性对象Field
Field对象 . set( 需要赋值的对象 , 值 ); 给Field对象赋值,第一个参数代表给指定的对象属性赋值
Field对象 . get( 取哪个对象的值); 得到Field中指定对象的值
Field对象 . setAccessible(true); 设置这个属性对象的访问权限为可访---不到万不得已不准用!

3、调用探究到的方法 --- invoke():
得到方法对象Method
方法对象 . invoke(调用指定对象); 使用指定对象的方法
Field对象 . setAccessible(true); 设置这个方法对象的访问权限为可访---不到万不得已不准用!

当数组做参数的时候,使用 类型... 的方式定义形参,这样做实参传递过来会自动封装成一个数组,调用者不用考虑参数个数:
数组传参语法糖: 方法(int... array)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值