JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java的反射就是不通过new的方法,从而获取一个类的内容.
1). jdbc中的:class.forname("drivername....") 就是利用了反射; spring配置文件XML文件中的bean标签,需要提供一个class的属性就是要通过解析XML文件获取类路径,从而加载类的class文件.
class文件就是java文件的编译文件,这个文件中包含java中的所有内容.
2). .class方法则是所有类里面的一个隐藏方法,通过他可以得到class文件.
3). 还有一种方法就是通过.getclass来进行获取.这个方法一般用在通过object接收了一个对象,不知道他的类型,直接.getclass获取他的内部信息.
通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等
Class 有很多方法:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
动态代理:
https://www.cnblogs.com/aspirant/p/9036805.html
动态代理就是提供一个中间人作为自动创建对象的一个方法.这个方法必须由一个继承了 InvocationHandler 接口的一个代理类进行代理.
那么问题来了:谁是中间人?
中间人是: Proxy
这个类有一个方法是用来做这个的:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
这个方法需要三个参数:
loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
第一个参数可以通过.class().getClassLoader() 方法进行获得
https://blog.csdn.net/lwl20140904/article/details/80163880
靠配置文件运行的反射:
首先:配置文件的格式是固定的,这样才能被一个 Properties类型(这个类型就是一个键值对的类型)
-
className = cn.fanshe.Student2
-
methodName = show2
通过读取流读取配置文件后就能够得到这个文件中的内容,读取到内容之后,className 是类包名, methodName 是方法名.
有了这两个就能够通过反射进行加载了.
这样的好处就是系统更新的时候不需要修改源码,直接修改配置文件,添加相应的代码文件就可以了.
动态代理:
静态代理就是针对不同的目标创建不同的代理对象,这样就会造成多个对象,代理的意义就不大了.
为了能够创建一个代理对象,而去代理多个不同的目标,这样就会节省很多空间.但是这个方法的前提条件是:必须提供一个目标的实例化对象,
通俗一些讲:代理的作用就像是秘书,可以雇主做所有的事情(假设),添加秘书之后有什么好处?我可以告诉秘书记得给我记账,如果没有秘书,雇主每次消费之后都得自己去记账,有了秘书之后,雇主只需要负责消费,记账就让秘书干了,这样记账这件事儿(代码)就不需要每次都亲自执行了,这就是静态代理, 问题来了,如果有一百个雇主呢?我要一个一个配秘书,资源太浪费了,这么大的开销,还不如我自己来(项目过大,容易造成资源浪费),是时候配一个大总管了,这个大总管将会代理所有人的事情,这样我就不需要和一百个秘书打交道了,而且开销也小了(只有一个动态代理),这个就是动态代理.
总结:代理就是实现一个切片管理的工具.
代码中使用代理有什么用???
https://blog.csdn.net/qq_26975307/article/details/53666166