涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!
前言
就比如我前几天被面试官问什么是反射???
而我的回答是!!!
反射是动态语言的关键,反射允许程序在执行期间借助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
涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!相关推荐
- 反射在java中的应用_java反射机制在项目中的运用
定义:Reflection是java开发语言特性之一,它允许运行中的java程序对自身进行检测,自审,并能操作程序内部的属性和方法,Reflection是java被视为动态语言关键之一.允许程序从执行 ...
- 关键路径法的“关键”是什么?是项目经理的进度把控能力!
在项目管理中,关键路径法是一定要学会的,在实际应用中需要通过它来估算项目可能的最短周期,在PMP考试中也是必考的知识点,同时也是最容易的失分点. 主要是关键路径不仅知识点晦涩难读,图例也是复杂难懂:. ...
- JAVA基础,注解反射机制
文章目录 注解 (非常重要) 什么是注解 基本注解 @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface ...
- Java程序员涨薪必备技能
2019独角兽企业重金招聘Python工程师标准>>> Java程序员涨薪必备技能 Java程序员涨薪必备技能 工作1-3年,当我们向老板提出加薪的时候,或者跳槽去"捡&q ...
- 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路
文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...
- 【Java】Java反射机制重点总结
文章目录 Java Reflection Java反射机制提供的功能 Java反射相关的主要API java.lang.Class类 Class类的核心要点 Class类的重要API 实例 实例化Cl ...
- java 反射机制及其应用
文章目录 一.反射的概述 二.关于Class类的理解并获取Class实例 2.1 关于 java.lang.Class 类的理解 2.2 获取Class实例的四种方式 三.Class实例对应的结构说明 ...
- Java开发之路—Java反射机制
Java反射机制 (重要) 1.反射的概述 1.1.本章的主要内容 1.2.关于反射的理解 1.3.体会反射机制的"动态性" 1.4.反射机制能提供的功能 1.5.相关API 2. ...
- Java - 反射机制
Java反射机制 Java反射机制概述 理解Class类并获取Class实例 类的加载与ClassLoader的理解 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 反射的应用:动 ...
最新文章
- 【EMC】电磁兼容性相关名词解释、基础知识
- docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
- rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读
- Service Worker ——这应该是一个挺全面的整理
- Leetcode 322. 零钱兑换 (每日一题 20210824)
- python 使用文本注解绘制树节点_整理了 34 个被吹爆了的Python开源框架
- SQL 备份与恢复之还原数据库
- Datawhale-零基础入门NLP-新闻文本分类Task02
- 结构光双目视觉测距原理
- iOS开发之各种动画各种页面切面效果
- cus系统前台改版 beta1.1发布
- 如何利用Google谷歌浏览器来查看GET或POST请求以及传递的数据
- html弹出框交互,HTML5/SVG模态窗口(对话框)交互动画
- matlab求两点的距离,matlab求两点间距离
- ubuntu无法进入图形界面,开机重复进入gun grup
- 2020 阿里、字节iOS面试题之Runtime相关问题2
- linux启动项加命令,启动项 命令(linux 添加开机启动项的三种方法)
- Pixracer V1.0编译固件
- 计算机组成原理 最新教材,《计算机组成原理(本科教材)》—甲虎网一站式图书批发平台...
- 用数字签名实现防篡改
热门文章
- Docker最全教程——MongoDB容器化(十三)
- 迈向现代化的 .Net 配置指北
- “被狗啃”的按钮引发的开源社区信任危机
- ASP.NET Core依赖注入深入讨论
- 拥抱.NET Core,学习.NET Core的基础知识补遗
- ASP.NET Core 开发-中间件(Middleware)
- php smarty入门,smarty 快速入门
- php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些
- java java 大端_Java 大小端转换
- 利用Python随机或暴力生成密码