【Java】 Java反射机制总结
一.什么是反射
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
二.为什么需要反射
首先我们要了解Java的编译类型有两种:
1.静态编译:在编译时确定类型,绑定对象即通过。
2.动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。
而Java反射机制在Java动态编译的起到了一个关键作用。
三.反射获取Class对象的三种方式(获取字节码对象)
- public class ReflectDemo1 {
- public static void main(String[] args) throws ClassNotFoundException {
- //方式一(通过Class.forName的方式,括号中是包名.类名)常用
- Class clazz1 = Class.forName("xx.ReflectDemo1");
- //方式二(类名.class)
- Class clazz2 = ReflectDemo1.class;
- //方式三(创建类的实例对象,再通过getClass的方式)
- ReflectDemo1 ref = new ReflectDemo1();
- Class clazz3 = ref.getClass();
- System.out.println(clazz1 == clazz2);//true
- System.out.println(clazz2 == clazz3);//true,三个字节码对象是同一个字节码对象
- }
- }
四.通过反射获构造器,成员变量,方法等
- public class ReflectDemo2 {
- private String name;
- public ReflectDemo2(String name) {
- super();
- this.name = name;
- }
- @Override
- public String toString() {
- return "[name=" + name + "]";
- }
- public void method1(){
- System.out.println("你好啊");
- }
- public void method2(String name){
- System.out.println("hello"+name);
- }
- public static void main(String[] args) throws Exception {
- //通过反射获取有参构造,并通过有参构造创建对象
- Class clazz = Class.forName("course9.ReflectDemo2");
- Constructor c = clazz.getConstructor(String.class);
- ReflectDemo2 ref = (ReflectDemo2) c.newInstance("zx");
- System.out.println(ref);
- //通过反射获取成员变量并使用
- Field f = clazz.getDeclaredField("name");//获取姓名字段(暴力反射获取,即使是私有变量)
- f.setAccessible(true);//设置去除私有权限
- f.set(ref, "ls");
- System.out.println(ref);
- //通过反射获取方法并使用
- Method m1 = clazz.getMethod("method1");
- Method m2 = clazz.getMethod("method2",String.class);
- m1.invoke(ref);
- m2.invoke(ref,"张三");
- }
- }
输出结果如下:
五.通过反射越过泛型检查
- public class ReflectDemo3 {
- public static void main(String[] args) throws Exception {
- //使用反射越过泛型的检查
- ArrayList<Integer> list = new ArrayList<>();//创建一个存放整型的链表
- list.add();
- list.add();
- Class clazz = Class.forName("java.util.ArrayList");//获取java.util.ArrayList类的字节码对象
- Method m = clazz.getMethod("add", Object.class);//获取其中的add方法
- m.invoke(list, "abc");//链表中添加字符串
- System.out.println(list);
- }
- }
输出结果如下:(“abc”不是Interger类型,但是能存放在创建的链表中)
六.反射实现动态代理
- public class ReflectDemo4 implements User{
- public static void main(String[] args) {
- ReflectDemo4 ref = new ReflectDemo4();
- ref.add();
- ref.delete();
- MyInvocationHandler m = new MyInvocationHandler(ref);//创建动态代理类(放入需要代理的对象)
- User user = (User) Proxy.newProxyInstance(ref.getClass().getClassLoader(), ref.getClass().getInterfaces(), m);//获取类加载器和接口
- System.out.println("-----------------------");
- user.add();
- user.delete();
- }
- @Override
- public void add() {
- System.out.println("添加功能");
- }
- @Override
- public void delete() {
- System.out.println("删除功能");
- }
- }
- interface User{
- public void add();
- public void delete();
- }
- //动态代理类
- class MyInvocationHandler implements InvocationHandler{
- private Object target;
- public MyInvocationHandler(Object target) {
- super();
- this.target = target;
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("权限校验");
- method.invoke(target, args);//执行被代理target对象的方法
- System.out.println("日志记录");
- return null;
- }
- }
输出结果如下:(动态代理前的输出和代理后的输出)
七.反射的一些应用
如加载一些文件
逆向代码 ,例如反编译
与注解相结合的框架 例如Spring
动态生成类框架 例如Gson
【Java】 Java反射机制总结的更多相关文章
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- 【转】java原理—反射机制
一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...
随机推荐
- PHP 页面中实现数据的增删改查
main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...
- leetcode-easy-string-14 Longest Common Prefix
mycode 91.59% class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not str ...
- Navicat1_介绍
https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&shareId=400000000398 ...
- leetcode 82 删除排序列表中的重复元素II
与83类似,不过需要注意去除连续的重复片段的情况,如2 2 3 3这种情况,以及[1,1]这种情况下最终的cur为NULL,因此不能再令cur=cur->next; /** * Definiti ...
- 浏览器端-W3School-浏览器端:JavaScript Array 对象
ylbtech-浏览器端-W3School-浏览器端:JavaScript Array 对象 1.返回顶部 1. Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对 ...
- nodejs之静态文件托管、 路 由、EJS 模板引擎、GET、POST
1.静态文件托管 静态文件托管:是指对于一个js方法进行封装,提高代码可读性 //fs模块 var fs=require('fs'); //path模块 var path=require('path' ...
- 阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤
环境搭建 新建工程 把对应的依赖复制过来 src下内容复制 配置spring中的声明事物 找到bean.xml开始配置 配置事物管理器 里面需要注入DataSource 2-配置事物通知 需要先导入事 ...
- tomcat gc和内存
tomcat启动参数,将JVM GC信息写入tomcat_gc.log CATALINA_OPTS='-Xms512m -Xmx4096m -XX:PermSize=64M -XX:MaxNewSiz ...
- Vue+Python 电商实战
安装webStorm https://blog.csdn.net/qq_38845858/article/details/89850737 安装NodeJs http://nodejs.cn/do ...
- 【Java基础】JAVA 使用线程的几种方式
之前放在自己网站上的例子,因为网站关闭,已经找不到了,想用的时候,没有的话又重新翻书是很麻烦的事情.所以重新记录一下,以备将来查看. 第一种,让任务类继承Runable接口,然后将任务类对象放入Thr ...