反射

类加载器:加载过程

加载,连接,初始化

分类:

Bootstrap ClassLoader 根类加载器:核心类的加载System,String这样的。在rt.jar文件中

Extension       扩展加载器:加载扩展目录中的jar目录

Sysetm       系统类加载器:自己写的文件

反射:通过class文件,去使用该文件中的成员变量,构造方法,成员方法

方式1:public Class getClass();

方式2:public static Class class;

方式3:Class类:public Class forName("全路径");

get后用Deckared修饰的是可以读private修饰的方法或者变量。末尾加有s的是获取所有没有则为单个

获取步骤:

1.通过反射获取class文件 三种方法;

2.通过指定方法来获取相应的方法或者变量;

3.通过2的指定方法类中的实现方法来使用获取到的方法或者变量;

实现方法:

public Object newInstance();当调用方法中有参数并被修饰后,直接实际参数使用

注意当实现的是一个私有方法或者变量的时候前面需要如下方法来暴力访问:

Constructor:

public static void SetAccessible(boolean);

获取构造方法:

public Constructor <> getConstructor(Class<>... parameterTypes);括号内的是参数,修饰用String.class(通用);

获取成员变量:

public Field <> getField();

在获取步骤上面添加:

4.使用Field的set方法:Field.set(obj,赋值);将值赋予给obj

获取成员方法:

public methods getMethod(方法名,参数);

4.public 方法返回值 invoke(obj,实际参数);

中介添加动态创建对象:广泛应用于动态添加在调用方法时候添加其他检测记录等条件

proxy类:

public static 被添加的对象 newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);

调用前重写InvocationHandler h接口

public Object invoke(Object proxy,Method method,object[] args){

添加的方法

源方法 Object result =method,invoke(被添加的对象,args);

return result;

}

你可能感兴趣的:(反射)