前言

就比如我前几天被面试官问什么是反射???

而我的回答是!!!

反射是动态语言的关键,反射允许程序在执行期间借助Reflection API取得任何类的内部信息,并能直接操作任曦对象的内部属性及方法。

1.Java反射提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和方法

2.放射常用的API

  • java.lang.Class : 代表一个类
  • java.lang.reflect.Method:代表类的方法
  • java.lang.reflect.Field:代表类的成员变量
  • java .lang.reflect.Construct:代表类的构造方法

3.java.lang.Class

我们创建一个类,通过编译(Javac.exe),生成对应的.class文件。之后我们使用java.exe加载(JVM类加载器)此.class文件。此.class文件加载到内存以后,就是一个运行时类。存放在缓冲区,Class允许通过一个实例化对象找到一个类的完成信息资料

Class类的作用:

  • 1.每一个运行时类只加载一次!
  • 2.获取对应的运行时类的完整结构(属性,方法,构造器,内部类,父类,所在包,异常,注 解。。。。) ​
  • 3.调用对应的运行时类的指定结构(属性,方法,构造器)
  • 4.反射应用:动态代理

4.获取Class对象。

1.调用运行时类本身的.class属性

Class<Person> personClass01 = Person.class;

2.通过运行时类的一个对象

Person person = new Person();
Class<? extends Person> aClass = person.getClass();

3.通过Class.forName("com.jdy.bean.Dog")

Class<?> aClass1 = Class.forName("com.jdy.bean.Dog");

4.通过类的加载器

ClassLoader classLoader = this.getClass().getClassLoader();

5.Class类的常用方法

public Constructor<?>[] getConstructors() throws SecurityException //获取类的全部构造
public Field[] getDeclaredFields() throws SecurityException//获取类中全部的属性
public Field[] getFields() throws SecurityException //获取继承的全部属性
public Method[] getMethods() throws SecurityException//获取一个类中的所有方法
public Class<?>[] getInterfaces() //获取类实现的所有接口
public native Class<? super T> getSuperclass();//获取类的父类
//加入Java开发交流君样:593142328一起吹水聊天

6.Class应用

(1)通过无参构造实例化对象

String packageName ="com.jdy.bean.Dog";
Class<?> aClass = Class.forName(packageName);
Dog dog = (Dog)aClass.newInstance(); //使用newInstance()必须保证实例化类中存在一个无参构造器

(2)调用有参构造器实例化对象

public int getModifiers()//获取构造方法的修饰符
public String getName()//获取构造方法的名称
public Class<?>[] getParameterTypes()//获取构造方法的参数类型
public T newInstance(Object ... initargs)//像构造方法,传入参数实例化对象
<Dog> constructor = (Constructor<Dog>) aClass.getConstructor(String.class, String.class, String.class);
Dog dog1 = constructor.newInstance("二狗子", "黑背", "8");

(3)获取类结构

  • Constructor:表示类的构造器
  • Field:表示类的属性
  • Method:表示类的方法

取得所有实现的接口

[] interfaces = aClass.getInterfaces();

取得父类

Class<?> superclass = aClass.getSuperclass();

取得全部构造器

Constructor<?>[] constructors = aClass.getConstructors();

将访问修饰符由数字转化成可看懂的

int modifiers = declaredField.getModifiers();
System.out.println("modifiers = " + Modifier.toString(modifiers));

取得所有的方法

Method[] methods = aClass.getMethods();

取得全部属性

  //得到实现的接口或父类中的公共属性
Field[] fields = aClass.getFields(); //得到本类当中的全部属性
Field[] declaredFields = aClass.getDeclaredFields();

Field的常用方法

//得到一个对象中属性的具体内容
public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException
//设置指定对象中属性的具体内容
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException//得到属性的修饰符
public int getModifiers() //返回属性的名称
public String getName() //判断属性是否可悲外部访问
public boolean isAccessible() //设置一个属性是否可被外部方法
public void setAccessible(boolean flag) throws SecurityException
//加入Java开发交流君样:593142328一起吹水聊天

(4)通过反射待用类中的方法

Method destory_method = aClass.getMethod("destory_method"); //invoke方法的参数是一个实例化的对象
Object invoke = destory_method.invoke(aClass.newInstance());

(5)通过方法操作属性

反射中通过Field类提供的set()/get()完成设置和取得属性内容的操作,但是类中的属性都设置成私有的访问权限,所以在使用set()/get()方法时首先要使用Field()中的setAccessible(true),方法将需要操作的属性设置成可被外部访问。

Field field0 = personClass.getDeclaredField("address"); //todo 什么校验
field0.setAccessible(true);
field0.set(person,"xian");
System.out.println(person);

一般给类的属性赋值,不建议使用以上方法,因为扩大了属性的访问权限,建议使用类中属性的getter/setter方法

5.ClassLoader:类的加载器 类的加载器是用来把类(class)装载进内存的,JVM规范定义了两种类型的类加载器: 启动类加载器(bootstrap) 用户类加载器(user-defind class loader) JVM 在运行时会产生3个类加载器组成的初始化加载器层次结构

Bootstrap ClassLoader:引导类加载器:用C++编写,时jVM自带的类加载器,负责JAVA平台核心类库的加载。该加载器无法直接获取资料

>//3.引导类加载器不能直接获取
ClassLoader parent1 = parent.getParent();
System.out.println("引导类加载器 = " + parent1);//null

Extension ClassLoader:负责jre/lib/ext目录下的jar包或者 -D java.ext.dirs指定目录下的jar包装入工作库

//2.获取扩展类加载器
ClassLoader parent = loader.getParent();
System.out.println("扩展类加载器 = " + parent);

System ClassLoader:系统类加载器,负责java -classpath或者 -D java.class.path所知的目录下的类与jar包装入工作,是最常用的加载器

//1.获取系统类加载器
ClassLoader loader = ClassLoader.getSystemClassLoader();
System.out.println("系统类加载器 = " + loader);

获取某个实例的类加载器

Person person = new Person();
Class<? extends Person> aClass = person.getClass();
ClassLoader classLoader = aClass.getClassLoader();
System.out.println("Perosn类的加载器 = " +classLoader);
aClass1 = Class.forName("com.jdy.bean.Dog");
ClassLoader classLoader1 = aClass1.getClassLoader();
System.out.println("Dog类的加载器 = " + classLoader1);

类加载器配合IO

ClassLoader classLoader2 = this.getClass().getClassLoader();
InputStream resourceAsStream = classLoader2.getResourceAsStream("test.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);

最后,祝大家早日学有所成,拿到满意offer

涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!相关推荐

  1. 反射在java中的应用_java反射机制在项目中的运用

    定义:Reflection是java开发语言特性之一,它允许运行中的java程序对自身进行检测,自审,并能操作程序内部的属性和方法,Reflection是java被视为动态语言关键之一.允许程序从执行 ...

  2. 关键路径法的“关键”是什么?是项目经理的进度把控能力!

    在项目管理中,关键路径法是一定要学会的,在实际应用中需要通过它来估算项目可能的最短周期,在PMP考试中也是必考的知识点,同时也是最容易的失分点. 主要是关键路径不仅知识点晦涩难读,图例也是复杂难懂:. ...

  3. JAVA基础,注解反射机制

    文章目录 注解 (非常重要) 什么是注解 基本注解 @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface ...

  4. Java程序员涨薪必备技能

    2019独角兽企业重金招聘Python工程师标准>>> Java程序员涨薪必备技能 Java程序员涨薪必备技能 工作1-3年,当我们向老板提出加薪的时候,或者跳槽去"捡&q ...

  5. 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

    文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...

  6. 【Java】Java反射机制重点总结

    文章目录 Java Reflection Java反射机制提供的功能 Java反射相关的主要API java.lang.Class类 Class类的核心要点 Class类的重要API 实例 实例化Cl ...

  7. java 反射机制及其应用

    文章目录 一.反射的概述 二.关于Class类的理解并获取Class实例 2.1 关于 java.lang.Class 类的理解 2.2 获取Class实例的四种方式 三.Class实例对应的结构说明 ...

  8. Java开发之路—Java反射机制

    Java反射机制 (重要) 1.反射的概述 1.1.本章的主要内容 1.2.关于反射的理解 1.3.体会反射机制的"动态性" 1.4.反射机制能提供的功能 1.5.相关API 2. ...

  9. Java - 反射机制

    Java反射机制 Java反射机制概述 理解Class类并获取Class实例 类的加载与ClassLoader的理解 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 反射的应用:动 ...

最新文章

  1. 【EMC】电磁兼容性相关名词解释、基础知识
  2. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
  3. rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读
  4. Service Worker ——这应该是一个挺全面的整理
  5. Leetcode 322. 零钱兑换 (每日一题 20210824)
  6. python 使用文本注解绘制树节点_整理了 34 个被吹爆了的Python开源框架
  7. SQL 备份与恢复之还原数据库
  8. Datawhale-零基础入门NLP-新闻文本分类Task02
  9. 结构光双目视觉测距原理
  10. iOS开发之各种动画各种页面切面效果
  11. cus系统前台改版 beta1.1发布
  12. 如何利用Google谷歌浏览器来查看GET或POST请求以及传递的数据
  13. html弹出框交互,HTML5/SVG模态窗口(对话框)交互动画
  14. matlab求两点的距离,matlab求两点间距离
  15. ubuntu无法进入图形界面,开机重复进入gun grup
  16. 2020 阿里、字节iOS面试题之Runtime相关问题2
  17. linux启动项加命令,启动项 命令(linux 添加开机启动项的三种方法)
  18. Pixracer V1.0编译固件
  19. 计算机组成原理 最新教材,《计算机组成原理(本科教材)》—甲虎网一站式图书批发平台...
  20. 用数字签名实现防篡改

热门文章

  1. Docker最全教程——MongoDB容器化(十三)
  2. 迈向现代化的 .Net 配置指北
  3. “被狗啃”的按钮引发的开源社区信任危机
  4. ASP.NET Core依赖注入深入讨论
  5. 拥抱.NET Core,学习.NET Core的基础知识补遗
  6. ASP.NET Core 开发-中间件(Middleware)
  7. php smarty入门,smarty 快速入门
  8. php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些
  9. java java 大端_Java 大小端转换
  10. 利用Python随机或暴力生成密码