*准备工作:

包结构:*

=======================

Person.java代码:

  1. package com.atguigu.java;
  2. public class Person {
  3. String name;
  4. private int age;
  5. public Person() {
  6. super();
  7. }
  8. public Person(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Person [name=" + name + ", age=" + age + "]";
  28. }
  29. public void show(){
  30. System.out.println("我是一个show方法");
  31. }
  32. }

=======================

反射的引用:

  1. package com.atguigu.java;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import org.junit.Test;
  5. /*
  6. * 反射的应用
  7. *
  8. */
  9. public class ReflectionTest {
  10. /*
  11. * 在反射之前,如何实例化Person类,并调用其内部结构
  12. */
  13. @Test
  14. public void test1(){
  15. //1.创建Person类的对象
  16. Person p1 = new Person();
  17. System.out.println(p1);
  18. //2.调用指定的属性
  19. p1.name = "Tom";
  20. //3.调用指定的方法
  21. p1.setAge(12);
  22. p1.show();
  23. System.out.println(p1);
  24. }
  25. /*
  26. * 反射的应用,完成与test1同样的操作
  27. *
  28. */
  29. @Test
  30. public void test2() throws Exception{
  31. Class clazz = Person.class;// PrintStream ps = System.out;
  32. //1.创建Person类的对象
  33. Person p = (Person)clazz.newInstance();
  34. System.out.println(p);
  35. //2.调用指定的属性
  36. //Field field1 = clazz.getField("name");会报错
  37. Field field1 = clazz.getDeclaredField("name");
  38. //设置指定的p对象的field1属性的值
  39. //f.set(Object obj,Object fieldValue):将obj对象的f属性设置为fieldValue
  40. field1.set(p, "Tom");
  41. System.out.println(p);
  42. //f.get(Object obj):获取指定的obj对象的f属性值
  43. System.out.println(field1.get(p));
  44. //3.调用指定的方法
  45. Method m1 = clazz.getDeclaredMethod("setAge",int.class);
  46. //m.invoke(Object obj,Object ... paramValues):调用obj对象指定的m方法,将参数值设置为Object ... paramValues
  47. m1.invoke(p, 20);
  48. System.out.println(p);
  49. }
  50. }

===================================

获取Class类的实例的几种方式:

  1. /*
  2. * java.lang.Class类的理解
  3. * 1.java反射机制的源头
  4. * 2.java程序经过编译(javac.exe)以后,生成一个或多个字节码文件(.class)文件,接着通过
  5. * java.exe命令将.class文件通过JVM的类的加载器加载到内存(缓存)中,一个字节码文件,就对应着一个
  6. * 运行时类。
  7. * 3.此时内存中的运行时类即为Class的一个实例。也就是说:一个Class实例就对应一个java运行时类
  8. * 4.内存中的运行时类,是存放在内存的缓存区,当再次被调用时,不会重新加载。
  9. *
  10. * 如何获取java.lang.Class类的实例(掌握)
  11. *
  12. */
  13. @Test
  14. public void test1() throws ClassNotFoundException{
  15. Person p = new Person();//1.将Person类加载到内存中 2.调用其空参的构造器
  16. Person p1 = new Person();//不会重新加载Person类,因为其已经存在于内存中
  17. //方式一:直接调用运行时类的.class属性获取
  18. Class clazz1 = Person.class;
  19. System.out.println(clazz1);
  20. //方式二:调用Class类的静态方法:forName(String className) --后续使用的较多
  21. String className = "com.atguigu.java.Person";
  22. Class clazz2 = Class.forName(className);
  23. System.out.println(clazz2);
  24. //方法三:调用运行时类对象的getClass()
  25. Class clazz3 = p.getClass();
  26. System.out.println(clazz3);
  27. System.out.println(clazz1 == clazz2 && clazz1 == clazz3);//true
  28. //方式四:使用类的加载器ClassLoader (了解)
  29. Class clazz4 = this.getClass().getClassLoader().loadClass("com.atguigu.java.Person");
  30. System.out.println(clazz4);
  31. System.out.println(clazz4 == clazz1);
  32. }

反射的应用、获取Class类实例的更多相关文章

  1. Java反射特性--获取其他类实例并调用其方法

    1. 代码结构 .├── com│   └── test│   └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...

  2. C#反射实例应用--------获取程序集信息和通过类名创建类实例

    AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...

  3. C#反射 获取程序集信息和通过类名创建类实例(转载)

    C#反射获取程序集信息和通过类名创建类实例 . System.Reflection 命名空间:包含通过检查托管代码中程序集.模块.成员.参数和其他实体的元数据来检索其相关信息的类型. Assembly ...

  4. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  5. C# 中反射获取某类的子类和根据类型名动态创建对象

    有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...

  6. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  7. C# 反射 通过类名创建类实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  8. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

  9. GO反射类实例

    变量的内在机制 类型信息:是静态的元信息,是预先定义好的 值信息:是程序运行过程中动态改变的 反射的使用 获取类型信息:reflect.TypeOf,是静态的 获取值信息:reflect.ValueO ...

随机推荐

  1. Sqlserver 查询把多行内容拼成一个字符串

    当使用:SELECT ','+Id FROM dbo.Test FOR XML PATH('')); //这样读取的数据虽然是1,2,3,4,但是仍然是xml格式,所以当数据超过2033时候,用sql ...

  2. LoRaWAN调试踩坑心得(一)

    先说两句 在调试和移植的过程中 我们经常想用节点去抓上行包 或者去抓下行包 但在抓取的过程中发现,上行包抓取不到到,或是下行包抓取不到,或者是两个都抓取不到,觉得非常的诡异.明明接收频点.BW和SF都 ...

  3. Linux查找命令对比(find、locate、whereis、which、type、grep)

    //太长不看版find查找磁盘空间,相较于locate和whereis速度较慢.find和locate的查找单位为文件或者目录,locate其实是find -name的另一种写法.locate和whe ...

  4. 安装tomcat出现的问题

    今天在安装tomcat时出现了配置环境不对的问题. 在正确配置Tomcat环境变量后,遇到很多次运行startup.bat后,一个窗口一闪而过的. 解决方法: 1.在tomcat的目录下选中start ...

  5. SpringBoot_@valid_参数校验

    SpringBoot @valid 参数校验 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不 ...

  6. js中尺寸类样式

    js中尺寸类样式 一:鼠标尺寸类样式 都要事件对象的配合 Tip:注意与浏览器及元素尺寸分开,鼠标类尺寸样式都是X,Y,浏览器及元素的各项尺寸时Height,Width 1:检测相对于浏览器的位置:e ...

  7. 通过代码审计找出网站中的XSS漏洞实战(三)

    一.背景 笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘.工具挖掘.代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为 ...

  8. CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装

    CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装 安装目录准备 新建data目录,用来放下载的软件 mkdir -p /data 切换到该data目录 ...

  9. mybatis 源码分析(八)ResultSetHandler 详解

    本篇博客就是 myabtis 系列的最后一篇了,还剩 ResultSetHandler 没有分析:作为整个 mybatis 最复杂最繁琐的部分,我不打算按步骤一次详解,因为里面的主要内容就是围绕 re ...

  10. 安装python的第三方库pillow

    参考:http://jingyan.baidu.com/article/ff42efa929e6c8c19f220254.html 用Python做图像处理时,需要用到PIL(图像处理库).但是PIL ...