一.什么是反射

  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为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反射机制总结的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  3. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  7. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  8. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  9. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  10. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

随机推荐

  1. Java 里volatile关键字是什么意思啊?如何使用呢?

    一旦一个并发共享变量(类的成员变量.静态成员变量)被 volatile 关键字修饰就具备了可见性(即一个线程修改了一个变量的值对于另一个线程来说是立即可见的)和有序性(即禁止进行指令重排序),实质是在 ...

  2. 【转】unity3d优化总结篇

    https://blog.csdn.net/weixin_33733810/article/details/94610167 某些技术或建议有些过时,但也值得参考 另外,关于如何设置不同layer的裁 ...

  3. CondenseNet: An Efficient DenseNet using Learned Group Convolutions

    1. 摘要 作者提出了一个前所未有高效的新奇网络结构,称之为 CondenseNet,该结构结合了密集连接性和可学习的分组卷积模块. 密集连接性有利于网络中的特征复用,而可学习的分组卷积模块则可以移除 ...

  4. hud 5750 Dertouzos

    Dertouzos Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  5. SuperSocket 学习笔记-客户端

    客户端: 定义 private AsyncTcpSession client; 初始化 client = new AsyncTcpSession(); client.Connected += Clie ...

  6. Git提示要输入密码

    在服务器上Git pull或者push时,一直提示要输入密码,但这个密码又不是Gitlab账户的密码,经过同学指点,原来是项目主分支被保护起来了,处于protected的状态,因为目前只有我一个人 在 ...

  7. elasticsearch 冷热数据的读写分离

    步骤 一.冷热分离集群配置 比如三个机器共六个node的es集群. 每个机器上各挂载一个ssd 和 一个sata.每个机器需要启动两个es进程.每个进程对应不同类型的磁盘. 关键配置: node.ma ...

  8. 【VS开发】使用WinPcap编程(2)——打开网络设备并且开始捕获数据包

    这里需要特别强调的一个数据结构是pcap_t,它相当于一个文件描述符,代表一个已经打开的设备.我们对这个设备进行操作,就是对这个文件描述符进行操作. 首先是打开一个已知的设备,使用pcap_open( ...

  9. 图片下载&&非同源图片下载&&同源下载&&网页点击下载图片

    非同源图片下载(html添加canvas标签) 方法1: downloadImgByBase64(url){ console.log() // 创建隐藏的可下载链接   // let  blob = ...

  10. spring boot-4.配置文件

    官方文档的23.4章节介绍了关于配置文件的内容 springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的 ...