反射

本章目标:

  1. 什么是反射reflect
  2. 什么是类类
  3. 如何获得"类对象"
  4. 反射三大作用:
    动态实例化对象
    动态调用方法
    动态读写属性
  5. 访问修饰符

=================================================

  1. 什么是反射
    反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法。
    反射是框架设计的灵魂。
    使用的前提条件:首先要得到Class文件。

  2. 什么是类类
    描述所有狗的类 狗类:Dog 狗对象:旺财
    描述所有猫的类 猫类:Cat 猫对象:肥波
    描述所有类的类 类类:java.lang.Class 类对象:特定类

  3. 一切反射相关的代码都从获得“类对象”开始——获得类对象
    类对象——即Class对象。
    类的对象——通过类实例化的地象,如Object obj = new Object();

    常用三种获取方式:
    3.1 Class.forName(完整类名)
    //已知类的全路径名,通过全路径名获得类对象
    Class c = Class.forName(“com.entity.Person”);
    3.2 类名.class
    Class c = Person.class;
    3.3 对象.getClass()
    Class c = p.getClass();
    Class c = new Person().getClass();

    注1:ClassNotFoundException(类名错|少jar包)
    注2:同一个类的类对象只会创建一个

  4. 反射三大作用(java.lang.reflect.*)

4.1 动态实例化对象
c.newInstance(); //类对象实例化对象

    其他操作:
c.getName();		//获得类对象全路径名
c.getSimpleName();		//获得类对象的类名
c.getPackage()		//获得当前类所在包
c.getSuperclass()		//获得父类的class
c.getInterfaces()		//获得接口
c.getConstructor()		//返回public构造方法
c.getDeclaredConstructors()	//返回带指定参数类型的构造方法(不区分public/private)
getParameterTypes()		//构造方法参数类型

4.2 动态调用方法
c.getMethods() //返回所有public的方法,父类公开方法一并获得
c.getDeclaredMethods() //返回所有方法,获得当前类的
c.getDeclaredMethod(method-name, parameter) //返回指定方法
m.setAccessible(true) //对所有属性设置访问权限 当类中的成员变量为private时 必须设置此项
MethodName.invoke(对象,参数) //调用方法

案例1:
Class c = Student.class;
try {
    Method me = c.getDeclaredMethod("abc", String.class);
    me.invoke(new Student(), "abc");
} catch (Exception e) {
    e.printStackTrace();
}

案例2:
Class c = Student.class;
Method m3 = c.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);  //授权
Object v3 = m3.invoke(new Student(), 10,20);
System.out.println(v3);

4.3 动态读写属性
c.getFields() //返回所有公开的属性
c.getField(String) //返回某个公开的属性

c.getDeclaredFields()		//返回所有属性(任意访问权限)
c.getDeclaredField(String)	//返回指定私有属性

c.setAccessible(true)		//为private属性设置赋值权限
属性.set(object, value)	//为属性赋值
属性.get(obj)		//获得obj对象的某值

案例:
Class c1 = Class.forName("p1.Student");
Field filed = c1.getDeclaredField("sid");   //返回私有属性
filed.setAccessible(true);	//为private属性设置赋值权限
filed.set(c1.newInteace, "s007");		//赋值
String sid =(String) filed.get(s);
System.out.println(sid);
  1. 访问修饰符
    c.getModifiers() //获得类、属性、方法的修饰符
    c.getType() //获得类型

     5.1 Modifier类
    

    Modifier.isStatic(int)
    Modifier.isFinal(int)
    Modifier.isPublic(int)
    Modifier.isPrivate(int)
    Modifier.isProtected(int)
    Modifier.isAbstract(int)
    Modifier.isInterface(int)
    Modifier.Native(int)

     5.2 修饰符对应值
    

    默认友好的 0
    PUBLIC 1
    PRIVATE 2
    PROTECTED 4

    STATIC 8
    FINAL: 16

    SYNCHRONIZED: 32
    VOLATILE: 64
    TRANSIENT: 128
    NATIVE: 256
    INTERFACE: 512
    ABSTRACT: 1024
    STRICT: 2048

    //将数值转换相应的修饰符
    Modifier.toString(field.getModiers())

课外参考:
Java基础之—反射(非常重要)
https://blog.csdn.net/sinat_38259539/article/details/71799078

深入理解Java反射
https://www.cnblogs.com/luoxn28/p/5686794.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值