Java笔记--反射机制
1、Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
2、Java反射机制提供的功能:
--在运行时判断任意一个对象所属的类;
--在运行时构造任意一个类的对象;
--在运行时判断任意一个类所具有的成员变量和方法;
--在运行时调用任意一个对象的的成员变量和方法;
--生成动态代理。
3、java.lang.Class类:此类是反射的源头
--当创建一个类(.java)并通过编译生成字节码文件(.class)之后,使用java.exe命令加载这个字节码文件(.class),当其被加载内存以后,就是一个运行时类,存在在缓存区,这个运行时类本身就是一个Class类的实例;
--一个运行时类只加载一次;
4、使用Class类的实例可以进行的操作:1)创建对应的运行时类的对象;2)获取对应的运行时类的完整结构(属性、方法、所在包、异常等);3)调用对应的运行时类的指定的结构(属性、方法、构造器);
5、反射的应用:动态代理;
6、获取Class实例的方法:1)调用运行时类本身的.class属性;2)通过运行时类的对象获取(XX.getClass());3)通过Class的静态方法获取(Class.forName(className));4)通过类的加载器获取(ClassLoader classLoader = this.getClass().getClassLoader();classLoader.loadClass(className));
--类的加载器是用来把类装载进内存的。JVM规范定义了两种类型的类加载器:启动类加载器和用户自定义加载器。
7、newInstance()创建运行时类对象时要求:1)对应的运行时类要有空参构造器;2)构造的权限足够。
8、获取运行时类的完整性结构:1)获取属性:Field[] getFields();//获取本类及父类中权限public的属性;getDeclaredField();//获取本类中声明的所有属性
2)获取属性的权限修饰符:int Field.getModifiers();//1:public 2:private 0:缺省
3)获取属性的变量类型:Class Field.getType();
4)获取属性名:String Field.getName();
5)获取方法:Method[] getMethods();//获取本类及父类中权限public的方法;getDeclaredMethods();//获取本类中声明的所有方法
6)获取方法的注解:Annotation[] Method.getAnnotation();
7)获取方法的权限修饰符:int Method.getModofiers();
8)获取方法的返回值类型:Class Method.getReturnType();
9)获取方法的方法名:String[] Method.getNames();
10)获取方法的形参列表:Class[] Method.getParameterTypes();
11)获取方法的异常类型:Class[] Method.getExceptionTypes();
12)获取所有构造器:Constructor[] getDeclaredConstructors();
13)获取运行时类的父类:Class getSuperclass();//不包括泛型 Type getGenericSuperclass();//包括泛型
14)获取父类的泛型:ParameterizedType param = (ParameterizedType)type; Type[] ars = param.getActualArguments();
15)获取实现的接口:Class[] getInterfaces();
16)获取所在的包:Package getPackage();
17)获取类注解:Annotation[] getAnnotations();
9、动态代理是指客户通过代理类来调用其他对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。它的使用场合有调试和远程方法调用。
10、代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理,代理对象决定是否以何时将方法调用转到原始对象上。
--例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) {
RealSubject real = new RealSubject(); MyInvocationHandler handler = new MyInvocationHandler(); //动态地返回一个实现了被代理对象所在类实现的的接口的代理类对象
Subject sub = (Subject)handler.blind(real);
sub.action();
} }
interface Subject{
void action();
}
//被代理类
class RealSubject implements Subject{
public void action(){
System.out.println("Hello World!");
}
}
//动态代理类
class MyInvocationHandler implements InvocationHandler{ Object obj;
public Object blind(Object obj){
this.obj = obj; //创建一个代理类的实例并返回
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
} //当通过代理类的对象发起对呗重写的方法的调用时,都会转化为invoke方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(method, args);
}
}
Java笔记--反射机制的更多相关文章
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- 【设计模式】Java设计模式 - 反射机制
[设计模式]Java设计模式 - 反射机制 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 反射 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
随机推荐
- RuntimeError: cuda runtime error (10) : invalid device ordinal
This is caused by the unmatching of gpu device number when loading a saved model. torch.load('my_fil ...
- iOS项目的一般开发流程
- preg_replace相关问题
preg_replace preg_replace 函数执行一个正则表达式的搜索和替换. 语法: preg_replace ( mixed $pattern , mixed $replacement ...
- ubuntu 18.04 上安装 docker
命令安装 docker 1.直接从 ubuntu 仓库安装,打开终端,输入: 2.启动 docker 服务 . 设置开机自启动 docker 服务 3.免 sudo 配置:
- 一 Spring概述
知识点概要: 1 SpringIOC入门(XML).Spring的Bean管理.Spring属性注入 2 SpringIOC注解方式.Spring的AOP开发(XML) 3 Spring的AOP注解开 ...
- Windows驱动开发-IRP的完成例程
<Windows驱动开发技术详解 >331页, 在将IRP发送给底层驱动或其他驱动之前,可以对IRP设置一个完成例程,一旦底层驱动将IRP完成后,IRP完成例程立刻被处罚,通过设置完成例程 ...
- Windows对应的"Hello,world"程序
<Windows程序设计>(第五版)(美Charles Petzold著) https://docs.microsoft.com/zh-cn/windows/desktop/apiinde ...
- 关于Android Studio中点9图的编译错误问题
Android中的点9图想必大家都非常熟悉了,能够指定背景图片的缩放区域和文本内容的显示区域,常见如QQ聊天界面的背景气泡这种文本内容不固定并需要适配的应用场景. 这里也给大家准备了一张图,详细介绍了 ...
- 38 java 使用标签跳出多层嵌套循环
public class Interview { public static void main(String[] args) { //使用带标签的break跳出多层嵌套循环 Boolean flag ...
- 记一次NoHttpResponseException问题排查
上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...