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)用反射方 ...
随机推荐
- Python压缩文件/文件夹
[Python压缩文件夹]导入“zipfile”模块 def zip_ya(startdir,file_news): startdir = ".\\123" #要压缩的文件夹路径 ...
- cmd常用小命令
#设置n秒后自动关机 -a取消 shutdown -s -t n #输出内容到fileName里,如果文件不存在将会创建文件,>是替换,>>是追加echo something > ...
- swoole 父子进程间通信
<?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...
- tomcat启动报错failed to start component
严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catali ...
- 从Facebook、苹果到外卖平台,“阴谋论”推动巨头企业不断蜕变
不可否认的是,在互联网向前加速推进的过程中,巨头企业和独角兽扮演着重要角色.它们以多元创意和深厚技术.资金实力,一步步改造着大众的互联网生活.而在此前,人们对巨头企业.独角兽的态度是颇为依赖的.但自从 ...
- vue动画钩子
<template> <div class="hello"> <div class="toggle" @click="f ...
- 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析
前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能 ...
- 浅谈脱壳中的附加数据问题(overlay)
Author:Lenus -------------------------------------------------- 1.前言 最近,在论坛上看到很多人在弄附加数据overlay的问题,加上 ...
- Xcode忽略编译警告
关于本文: 1.说明让Xcode忽略编译警告的目的 2.关于编译警告的开启与关闭的实现 3.顺便借此机会宣传下理解编译原理的大大好处 临时有事,后面更新.
- sklearn实现决策树算法
1.决策树算法是一种非参数的决策算法,它根据数据的不同特征进行多层次的分类和判断,最终决策出所需要预测的结果.它既可以解决分类算法,也可以解决回归问题,具有很好的解释能力.另外,对于决策树的构建方法具 ...