反射(一)

1.反射是什么?

   反射就是“把java类中的各种成分映射成java中的各种类”;

 

2.反射能做什么?

   (1)做框架用;

   (2)让代码通用性更好;

3.反射的优点和缺点:

缺点:影响程序的性能;

优点:可以实现动态的创建对象和编译。

 

4.如何反射?

  (1)获取类的字节码的3种方式:

A.利用字节码类ClassClass clazz = Class.forName(类的完整名称);

B.利用类变量classClass clazz = 类名.class;

C.利用对象的方法:Class clazz = 对象.getClass();

      *Class的理解:

       描述人的属性和行为用Person类,描述类的属性和行为用Class

      人的具体对象有张三、李四等,Class的具体对象就是被JVM加载进内存(硬盘上的静态.class文件不是)的String.class,int.class,Student.class这样的字节码文件,JVM虚拟机把字节码文件加载进内存的动作就是创建Class具体对象的过程,字节码文件在内存中只有一份,并且是由字节码代表的类的对象共享的,所以它的引用是由字节码代表的类的静态成员变量,即类变量class维护(我自己的猜测:String.class就是我们在代码里写的String,只是使用的时候省略了后面的.class而已);

 

*我们可以把类和类的字节码认为是同一个东西,只是叫法不一样,比如一个人在家里被爸爸妈妈叫做“阿亮”,但是在外边被哥们叫做“亮哥”,但它们指的是同一个人。

 

  (2)获取类(即字节码)的信息:

A.获取Constructor:  

       获得所有public的:getConstructors();

       获取特定public的:.getConstructor(要获取的方法的参数对应的字节码列表);

   获取所有的(public,protected,default,private):getDeclaredConstructors();

   获取任意(public,protected,default,private)特有的:getDeclaredConstructors(StringBuffer.class);

  注意:当使用带有Declared的方法获取成员,如果获取的是私有的,然后在使用这些私有成员之前,一定要使用.setAccessible(true);打开访问权限;

 

B.获取Field:类似获取获取构造函数,只是获取特定属性的时候传入的参数是属性名称对应的字符串(如获取int x ,那么传入的参数就是“x”);

C.获取Method;类似获取构造函数;

 

(3)使用Constructor

      创建对象:Constructor.newInstance(...);

(4)使用Field:

      获取某个对象的属性值:Filed.get(对象名)

      设置某个对象的属性值:Field.set(对象名,新的值)

(5)使用Method:

  执行普通方法:Method.invoke(对象名,参数);

  执行静态方法:Method.invoke(null,参数);

(6)使用Class的对象可以除了获取类的构造函数类,属性类,方法类外,还可以获取类的父类,类上的注解,类的描述信息

(7)获取了构造函数类、属性类,方法类后除了可以执行基本操作外,同样可以获取它们的修饰符以及注解信息等;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值