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)用反射方 ...
随机推荐
- LIBRA查询
SELECT COUNT(1)FROM rawdata_vehiclepassing xWHERE x.passingtime >= to_date('2019-11-24,00:00:00', ...
- Preparing for the interview of FLAG and USDA
7,Dynamic Programming 1,Unique Paths A robot is located at the top-left corner of a m x n grid (mark ...
- twisted 模拟scrapy调度循环
"""模拟scrapy调度循环 """from ori_test import pr_typeimport loggingimport ti ...
- FTP、SFTP、SCP的区别
转载于>> FTP(File Transfer Protocol) 是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网 ...
- springboot 模板
参考:https://blog.csdn.net/wangb_java/article/details/71775637
- zookeeper和eureka的区别在哪?
zookeeper和eureka的区别在哪?传统的关系型数据库是ACID(原子性,一致性,独立性,持久性), nosql数据库是CAP(强一致性,可用性,分区容错性),分布式系统只能3进2,三个选两个 ...
- 八大排序算法C++代码实现
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...
- 访问docker desktop创建的Hyper-v虚拟机DockerDesktopVM
平常我们部署kubernetes ,一般都是先安装个linux操作系统,不管是centos或者ubuntu或者其他,都是我们手工操作的.安装好的这个操作系统都开启了SSH,能够远程登录访问. 但是do ...
- YII insert multiple records into a table
$values = array(array(1,2),array(3,4),array(5,6),); $nbValues = count($values); $sql = 'INSERT INTO ...
- C语言调试器GDB和LLDB的使用方法
调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...