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)用反射方 ...
随机推荐
- log4j2 异步多线程打印日志
log4j2 异步多线程打印日志 Maven依赖 <dependency> <groupId>org.apache.logging.log4j</groupId> ...
- Legal High
不让任何人承担责任,不想看的东西就回避, 但是,如果想夺回值得夸耀的生存方式,就必须看那些不愿意看的现实,必须带着身负重伤的觉悟前进,这才叫做战斗. 有怨言的话去坟墓里说,钱不是全部,钱就是你们向对手 ...
- 【PAT甲级】1034 Head of a Gang (30 分)
题意: 输入两个正整数N和K(<=1000),接下来输入N行数据,每行包括两个人由三个大写字母组成的ID,以及两人通话的时间.输出团伙的个数(相互间通过电话的人数>=3),以及按照字典序输 ...
- 跳转连接转base64
//配置H5连接 @Value("${h5.domain}") private String h5Domain; // 校验商家端权限 public String checkSta ...
- Linux centos7 LAMP架构介绍、 MySQL、MariaDB介绍、MySQL安装
一.LAMP架构介绍 为Linux+Apache(httpd)+MySQL+PHP简写,把后三者安装在Linux Apache是最常用的的web服务软件,MySQL为小型的数据库存储软件,PHP为脚本 ...
- underscore.js -2009年发布的js库
2009 Underscore.js 0.1.0发布 Underscore一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象.它是这个问题的 ...
- 学习SpringMVC 文件上传 遇到的问题,403:returned a response status of 403 Forbidden ,409文件夹未找到
问题一: 409:文件夹没有创建好,找不到指定的文件夹,创建了即可. 问题二: 403:returned a response status of 403 Forbidden 我出现这个错误的原因是因 ...
- 「AMPPZ2014」The Captain
传送门: 这是一道bzoj权限题 Luogu团队题链接 解题思路 直接连边的话边数肯定会爆炸,考虑减少边数. 我们画出坐标系,发现一个东西: 对于两个点 \(A,B\),\(|x_A-y_A|\) 可 ...
- 1 Oracle概述&与MySQL的差别&SQL语句分类复习
一. 知识点目录 Oracle的概念和安装 基本查询 条件查询 Oracle中的函数 多表查询 子查询 表空间的状态 用户 视图 索引 序列 同义词 PLSQL编程 游标 存储过程 存储函数 触发器 ...
- 8核AMD Zen加持:微软Surface这回血拼
微软定于10月2日在纽约举办Surface新品发布会,几乎全线消费级产品都将更新,比如15英寸Surface Laptop 3. 最新爆料称,15寸Surface Laptop 3预计一口气推出6款型 ...