反射

  1. 什么是反射
    反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
    .java -> .class
    .class -> .java

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

  3. 一切反射相关的代码都从获得类对象开始
    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:同一类的、类对象只会创建一个

  1. 反射三大作用(java.lang.reflect.*)
    4.1 实例化对象
    c.newInstance(); //类对象实例化对象

    c.getName(); //获得类对象全路径名
    c.getSimpleName(); //获得类对象的类名
    c.getConstructor() //返回public构造方法
    c.getDeclaredConstructor() //返回带指定参数类型的构造方法(不区分public/private)

    c.getParameterTypes() //构造方法参数类型
    c.getPackage() //获得当前类所在包
    c.getSuperclass() //获得父类的class
    c.getInterfaces() //获得接口

4.2 动态调用方法
c.getMethods() //返回所有公开的方法
c.getDeclaredMethods() //返回所有方法

c.getDeclaredMethod(method-name, parameter)	//返回指定方法
c.setAccessible(true)		//对所有属性设置访问权限  当类中的成员变量为private时 必须设置此项
Method.invoke()			//调用方法


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

案例2:
Method m3 = c1.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object v3 = m3.invoke(s, 10,20);  //s是实例化的对象
System.out.println(v3);

4.3 读写属性
c.getDeclaredField() //返回所有属性(任意访问权限)
c.getDeclaredField(String) //返回指定私有属性
c.getField(String) //返回某个公开的属性
c.getFields() //返回所有公开的属性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值