1.学习了Class对象,Filed对象(对应数据),Method对像(对应函数),Constructor对象(对应构造函数)。

2.Declared可用于获取私有的数据和方法,但是打印得使用setAccessible(true);来要忽略访问权限修饰符的检查。

3.FS5()函数有一个点需要注意就是地址一致,原因我写在注释里了。

#FS练习配置文件
#1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
#2.在程序中加载读取配置文件
#3.使用反射技术来加载类文件进入内存
#4.创建对象
#5.执行方法
#
#
className=bean.Admin 
methodName=eat

Filed对象的学习

 /**
* 学习java反射机制
* Field对象的学习
*/
@Test
public void FS1() throws NoSuchFieldException, IllegalAccessException {
Class userClass = User.class; Field[] fields = userClass.getFields();//获取所有public的成员对象
for(Field field:fields)
{
System.out.println(field);
} Field field1 =userClass.getField("fs");//按照变量名获取 /*
Field 操作
1.设置
set
2.获取
get
*/
User user1=new User();
System.out.println(field1.get(user1));
field1.set(user1,"dada");
System.out.println(field1.get(user1)); //忽略修饰符 可以获取到私有的
Field[] full=userClass.getDeclaredFields();
for(Field field:full)
{
System.out.println(field);
}
//获取单个某一个 忽略修饰符
Field privateField=userClass.getDeclaredField("id");
//但是打印私有的,需要忽略访问权限修饰符的检查
privateField.setAccessible(true); //暴力反射
System.out.println(privateField.get(user1));
}

Constructor对象的学习

 /**
* 反射机制获取构造方法
*/
@Test
public void FS2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class userClass = User.class;
//获取所有的
Constructor[] constructors=userClass.getConstructors();
for(Constructor constructor:constructors)
{
System.out.println(constructor);
}
//获取单个
Constructor constructor =userClass.getConstructor(Integer.class,String.class);
System.out.println(constructor); //使用获取的constructor创建对象
Object user =constructor.newInstance(5,"dada");
System.out.println(user.toString()); /*
使用空参的构造方法
*/
Constructor constructor1 =userClass.getConstructor();
System.out.println(constructor);
Object user1 =constructor1.newInstance();
System.out.println(user1.toString());
System.out.println("与上同理");
//与上同理,Class这个方法就是为了方便调用空参的构造方法
Object user2=userClass.newInstance();
System.out.println(user2.toString()); //暴力反射constructor.setAccessible();
}

Method对象的学习

 /**
* 反射机制获取方法
* Method
*/
@Test
public void FS3() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class userClass = User.class; //获取类名
String className =userClass.getName();
System.out.println(className);
//获取public所有方法
Method[] methods = userClass.getMethods();
for (Method method:methods)
{
//也会打印Obj里的方法
System.out.println(method);
//获取方法名
System.out.println(method.getName());
}
// 获取方法 根据方法名 返回值
Method eat = userClass.getMethod("eat");
Method eat1= userClass.getMethod("eat",int.class);
User user=new User();
eat.invoke(user);//执行方法
eat1.invoke(user,1);//执行方法 }

配置文件和反射的使用

 /**
*配置文件和反射的使用
*/
@Test
public void FS4() throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//1.加载配置文件
Properties pro =new Properties();
//获取classes目录下的配置文件 ClassLoader类
ClassLoader classLoader=TestUserFS.class.getClassLoader();
//获取输入流
InputStream resourceAsStream = classLoader.getResourceAsStream("FS.properties");
//加载
pro.load(resourceAsStream); //2.获取配置文件中定义的数据
String className =pro.getProperty("className");
String methodName =pro.getProperty("methodName");
System.out.println(methodName);
//3.加载类进内存
Class userClass = Class.forName(className);
//4.创建对象
Object obj=userClass.newInstance();
//5.获取对象方法
Method method=userClass.getMethod(methodName);
//获取带参数的那个eat函数
Method method1=userClass.getMethod(methodName,int.class);
//6.执行方法
method.invoke(obj);
method1.invoke(obj,1);
}

三种常用的方法: Class.forName()函数,我在用JDBC的时候用到过,其他俩种很少。

 /**
* 笔记
* 1.Class.forName("全类名")
* 2.对象.getClass():方法获取
* 3.类名.class:通过类名的属性class获取
*/
@Test
public void FS5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { //1用于配置文件中
Class objClass1= Class.forName("bean.User");
System.out.println(objClass1);
Object user1=objClass1.newInstance();
Method method1=objClass1.getMethod("eat");
method1.invoke(user1); //2.用于现有对象的获取字节码
Class objClass2=User.class;
System.out.println(objClass2); //3.用于参数传递
User user3=new User();
Class objClass3=user3.getClass();
System.out.println(objClass3); /*
* 三个是相同的地址
* 为什么呢?
* 因为class加载进内存后只会一次,所以你获取他的时候只有一个
*/
System.out.println(objClass1.hashCode());
System.out.println(objClass2.hashCode());
System.out.println(objClass3.hashCode());
}

总结:java的反射机制和配置文件真的太好用了,就我之前学习的log4的配置在控制台错误输出对我帮助很大。

java的Junit让我写代码越来越方便。

 

java反射的认知和学习的更多相关文章

  1. Java反射机制的简单学习

    今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...

  2. java 反射(reflect)总结,附对象打印工具类

    java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...

  3. 理解Java反射机制

    理解Java反射机制 转载请注明出处,谢谢! 一.Java反射简介 什么是反射? Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对学习框架技术有很大 ...

  4. java反射的基础学习代码

    java反射的学习,好多东西不太理解,主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子. 主要的练习类 package javaAdvanced ...

  5. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  6. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  7. 云笔记项目-Java反射知识学习

    在云笔记项目中,补充了部分反射的知识,反射这一部分基础知识非常重要,前面学习的框架Spring和MyBatis读取xml配置文件创建对象,以及JDBC加载驱动等都用了反射,但只知道有这个东西,具体不知 ...

  8. java反射以及动态代理的学习

    java反射学习 1)字节码文件的三种获取方式 ①:Object类的getClass()方法:对象.getClass() ②:数据类型的静态的class属性:类名.class ③:通过Class类的静 ...

  9. Java反射篇学习笔记

    今天重新学习了java中的反射,写一篇学习笔记总结一下.代码基本都是照着两篇博客敲的: 参考一:   https://blog.csdn.net/sinat_38259539/article/deta ...

随机推荐

  1. pwn之偏移量offset

    0x7fffffffdd00: 0x4141414141414141 0x4141414141414141 0x7fffffffdd10: 0x4141414141414141 0x414141414 ...

  2. 第1节 storm编程:3、storm的架构模型的介绍

    nimbus:主节点,接收客户端提交的任务,并且分配任务,新的版本当中nimbus已经可以有多个了 zookeeper集群:storm依靠zk来保存一些节点信息,nimbus将分配的任务信息都写入到z ...

  3. docker学习笔记-05:DockerFile解析

    一.DockerFile是什么 1.DockerFile是用来构建docker镜像的构建文件,是由一系列参数和命令构成的脚本. 2.构建三步骤: 手动编写一个dockerfile文件,然后直接dock ...

  4. 前端面试题CSS一(题目来源网络)

    一.什么是html5语义化? 使用合理,正确的html标签格式化文档. 二.CSS样式优先级? 就近原则,行内>内联>外联 三 什么是盒模型? 主要分为两种,w3c标准盒模型,IE标准模型 ...

  5. 076、Java数组之定义数组

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. APP自动化测试获取包名的两种方法

    获取包名的两种方法: 一.通过aapt获取 1.进入aapt.exe所在路径 2.在地址栏输入cmd回车,打开dos命令窗口. 3.在命令窗口输入 aapt dump badging 拖入apk 回车 ...

  7. iOS dismissViewControllerAnimated:completion:使用方法

    我们都知道dismissViewControllerAnimated:completion:方法是针对被present出来的控制器的,一般我们这样使用:在一个控制器中present另外一个控制器A,然 ...

  8. ROS常用库(二) Serial库(单片机和上位机串口通讯)

    比如我们做了个单片机,在win里面用串口调试助手接收和下发数据,那么在ubuntu里用ros怎么实现?换个说法,怎么实现上位机和下位机的通讯? 首先,用python自带的库就可以实现这个功能. 安装p ...

  9. java#java.util.Date与java.time.LocalDateTime的转换

    转换主要通过Instant来进行的. Date date = new Date(); LocalDateTime localDateTime = LocalDateTime.ofInstant(dat ...

  10. maven详解之 pom.xml 解释

    <project>:pom.xml的根标签,一个maven项目用一对<peoject></project>标签包裹. <modelVersion>4.0 ...