*准备工作:

包结构:*

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

Person.java代码:

package com.atguigu.java;

public class Person {
String name;
private int age; public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public void show(){
System.out.println("我是一个show方法");
}
}

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

反射的引用:

package com.atguigu.java;

import java.lang.reflect.Field;
import java.lang.reflect.Method; import org.junit.Test; /*
* 反射的应用
*
*/
public class ReflectionTest {
/*
* 在反射之前,如何实例化Person类,并调用其内部结构
*/
@Test
public void test1(){
//1.创建Person类的对象
Person p1 = new Person();
System.out.println(p1);
//2.调用指定的属性
p1.name = "Tom"; //3.调用指定的方法
p1.setAge(12);
p1.show(); System.out.println(p1);
} /*
* 反射的应用,完成与test1同样的操作
*
*/
@Test
public void test2() throws Exception{
Class clazz = Person.class;// PrintStream ps = System.out; //1.创建Person类的对象
Person p = (Person)clazz.newInstance();
System.out.println(p); //2.调用指定的属性
//Field field1 = clazz.getField("name");会报错
Field field1 = clazz.getDeclaredField("name");
//设置指定的p对象的field1属性的值
//f.set(Object obj,Object fieldValue):将obj对象的f属性设置为fieldValue
field1.set(p, "Tom"); System.out.println(p);
//f.get(Object obj):获取指定的obj对象的f属性值
System.out.println(field1.get(p)); //3.调用指定的方法
Method m1 = clazz.getDeclaredMethod("setAge",int.class);
//m.invoke(Object obj,Object ... paramValues):调用obj对象指定的m方法,将参数值设置为Object ... paramValues
m1.invoke(p, 20);
System.out.println(p);
}
}

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

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

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

反射的应用、获取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. 关于在taro使用wx.parse那些事

    好久不见,好久没更新博客,最近工作也比较忙,今天在使用解决富文本的时候遇到两个bug,由于第一次使用wx.parse经验不足,走了很多弯路,今天特地把自己修复bug的感想分享一下,希望能帮助更多的小伙 ...

  2. 敏捷之旅--携程Scrum Master 新官上任三把火?

      随着敏捷在国内的推行,越来越多的公司和组织开始使用敏捷领导团队. 敏捷团队如雨后春笋之势涌现. 敏捷教练的团队也越来越壮大.   原先只需要一个敏捷教练就能搞定,但是随着团队越来越多,我们难免会将 ...

  3. Redis学习总结(六)--Redis集群伸缩

    我们在上一章讲了如何创建集群,今天我们来实现下集群的伸缩. 添加节点 操作流程 1.启动节点 2.将节点加入到集群中 3.将数据槽从原来的节点迁移部分到新节点上 实践 1)准备两个新节点并启动 [ro ...

  4. ionic $state.go() 传参

    例子: $state.go("tab.home" , {"hello": "world"}) 重点: 接受参数的页面--tab.home,需 ...

  5. 设计模式(C#)——06桥接模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       在早先,几乎每个手机的充电器接口都是不同的.每个型号的手机都有一个充电器,此时我们把充电器作为一个抽象类,抽象类中提 ...

  6. LeetCode刷题 - (01)两数之和

    题目描述 给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  7. [企业微信通知系列]Jenkins发布后自动通知

    一.前言 最近使用Jenkins进行自动化部署,但是部署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于接收方的接收设置,导致不能及时看到相关的发布内容.而由于公司使用的是企业微信,因此 ...

  8. Windows 7 sometimes breaks FTP connections on Java 7 if firewall is enabled.

    Solution: 用管理员身份,在cmd命令行输入: netsh advfirewall set global StatefulFTP disable 会关闭防火墙,从而解决问题.

  9. zstu19一月月赛 duxing201606的原味鸡树

    duxing201606的原味鸡树 题意: 给定一颗有n(n<=1e9)个节点的完全二叉树,1e5次询问,问某个节点有几个子节点. 思路: 自己在月赛上没有思路,问了zfq才知道. 设两个指标, ...

  10. About 睡觉觉吃饭饭

    rdc 的日常作息: 11:50 左右起床,洗漱后飞奔到超市买咖啡饼干,然后飞奔到实验室. 开始被比赛打:比赛前期觉没睡醒,题没读懂就开始乱写,签到签不上,比赛中期处于要被饿死的状态. 赛后吃饭饭,随 ...