java反射 笔记

基础笔记1: 08/26 2020

java基础 反射

plus:反射我这里是根据b站的狂神和黑马的课程学习。

Java反射机制是在运行状态中,
对于任意一个类,都能知道这个类的所以属性和方法;
对于任何一个对象,都能够调用它的任何一个方法和属性;
这样动态获取新的以及动态调用对象方法的功能就叫做反射。

特性

image
包含内容:通过class类对象来set和get内部的方法,虽然使用reflect会使隐秘性和安全性降低,但调用到改写都更为灵活,同时也是动态代理的基石。

java反射有专名包 java.lang.reflect 但是内部方法主要是用在动态代理
java 反射主要使用的是class类的: method constructor fields interface 等内容来达到反射出想要结果的效果。

获取类对象(内存中的class)的四种方法:

§1 字节码–>class对象:

Class.forName(“完整包路径的类名”)

§2 class.java 某类

可以直接调用属性即可
xxx.class

§3 处于runtime时 instance 获得

instanceName.getClass();

§4 某些特殊的系统类

such as Integer

use Integer.Type

获得后的类使用方法:

1.Field(定义的类对象内的属性)

classname.getFields()
get all(but only public announced) in a list
classname.getField(“fieldname”)
get specific one (but only public announced,not public may return null) in a list
classname.getDeclareFields()
get all(include private announced) in a list
classname.getDeclareField(“fieldname”)
get specific(include private announced) in a list

fields可以这样用,用getset来设置某实例内field对应方法的值:
下面的方法和构造器也是同样的getDeclarexxx()

for field in fields:
field.get(instance)
field.set(instance,values)

2.Constructor 构造器

Constructor is a method with special mechanism.
So it standalone to get set
大部分时间上来说,constructor是拿来创建有重写构造方法的类实例的。不会像普通方法一样invoke

classname.getConstructor(someType.class)
:如果不填参数对应类型的类,会默认调用空参数构造方法。
填哪种参类就对应哪个构造方法。

填String.class 就代表着传入参数是string的构造方法。

constructor.newInstance(args*)
:对获得的构造器传入参数后创建对应实例。
如果不传参,那和使用classobj.newInstance()没有区别

3.method 方法类 常用

classname.getMethod(“methodname”)
获取方法可以直接使用类对象来直接获取。

执行函数
method.invoke(instance,args)
想执行该函数必须拥有实例,
args
是函数所需的参数,也可以不存在

instance一般通过newInstance创建

注意:获取私有统统需要xxx.setAccessible(true)

##附加 ClassLoader

ClassLoader在动态代理和这里都会用到,用来读取类/输入流进入内存以供使用。
Class.getClassLoder() 获得指定类的类加载器

classloader 一般使用方法
classloader.getSystemResource()
classloader.getSystemResourceAsStream(“filename which in Resources “);
然后使用properties 类的load 来读取流,用getproperty就可以获取对应的值了。