学习java第二十四天

学习java第二十四天

java 反射:

对任意类任意操作,任意对象的都可调用其任意的方法,属性。(不管是否私有)
java文件,通过javac编译成 . class文件。

class对象,用于描述对象的对象。

Class类
获取这个Class 对象:
有三种方式来获取Class 对象
第一种 (根本不用)
Student student = new Student();
Class c = student.getClass();
第二种: Class c1 = Student.class;
第三种: Class c2 = Class.forName(“com.offcn.day24.test.Student”); //参数传递的是完整的包名加上类名
常规方法:
获取构造
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 (获取所有的公有的构造)

Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 (获取所有的构造,包含私有(受保护的))
Constructor getConstructor(Class<?> parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 (获取是单个公有的构造,参数是构造参数的数组,) . . . 表示可以带多个参数
public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 获取私有的构造方法
注意:
注意点:1.带参数的构造传递的是 类型的.class 文件
注意点2: public static void setAccessible( boolean flag) 暴力反射,去除私有
… 表示可以传递多个参数
什么都不用填默认是传无参的构造,有参传递的相应类型的class文件。

T newInstance()
创建此 Class 对象所表示的类的一个新实例。

新建一个类
1.newInstance();实例化一个对象
2.获取其构造、通过构造newInstance()实例化一个对象
类 Constructor
常规方法:
public T newInstance(Object… initargs)创建该构造方法的新实例

获取方法
public Method[] getMethods() 获取所有公有的方法(同时也会获取到父类公有的方法)
public Method[] getDeclaredMethods() 获取所有的包括私有的方法(不包含父类的)
public Method getMethod(String name,Class<?>… parameterTypes) 获取单个公有的方法 第一个参数是方法的名称、第二个参数是方法类型的class
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)返回一个 Method 对象,(获取单个私有的方法)

错误是: class com.offcn.day24.test.Student with modifiers “private” 也就是没有除去私有
类 Method
常规方法:
public Object invoke(Object obj,Object… args) 调用其方法 第一个参数 是对象 ,第二个参数: 方法的具体的参数

获取属性
public Field[] getFields() 获取所有公有的属性
public Field[] getDeclaredFields() 所有所有的属性(包含私有的)
public Field getField(String name) 获取当个公有的属性 参数:属性的名称
public Field getDeclaredField(String name) 获取私有的属性

类 Field
Field 的方法
设置值:
public void set(Object obj,Object value) d第一个参数是对象,第二个参数是具体赋的值
取值: 第一种取值的方法 Object obj = c2.newInstance(); Student student = (Student) obj;
第二种取值的方法是 : public Object get(Object obj) 参数传递的是对象
反射调用注意点
在得到构造或者是方法的时候都传递的是类型的 class,只有在调用的时候传递的才是具体的值了
共同点:
获取公有的构造、方法,属性:
get***();
获取私有的构造,方法,属性:
getDeclared***();
.setAccessible(true);调用其方法暴力反射,去除私有。

java必备的测试:
黑盒测试:运行程序后输入输出,从用户角度来执行程序
白盒测试:写脚本,linux脚本,js脚本 、 java一般Junit 局部测试
debug调试:
设置断点。
关键位置逐步执行。

总结:学习这个反射,觉得很强大,就连私有的属性方法都可以调用,那我们设置这些类的私有的属性等,都可以被调取,有什么用呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值