反射的应用、获取Class类实例
*准备工作:
包结构:*
=======================
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类实例的更多相关文章
- Java反射特性--获取其他类实例并调用其方法
1. 代码结构 .├── com│ └── test│ └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...
- C#反射实例应用--------获取程序集信息和通过类名创建类实例
AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...
- C#反射 获取程序集信息和通过类名创建类实例(转载)
C#反射获取程序集信息和通过类名创建类实例 . System.Reflection 命名空间:包含通过检查托管代码中程序集.模块.成员.参数和其他实体的元数据来检索其相关信息的类型. Assembly ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- C# 中反射获取某类的子类和根据类型名动态创建对象
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- C# 反射 通过类名创建类实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- GO反射类实例
变量的内在机制 类型信息:是静态的元信息,是预先定义好的 值信息:是程序运行过程中动态改变的 反射的使用 获取类型信息:reflect.TypeOf,是静态的 获取值信息:reflect.ValueO ...
随机推荐
- (四十一)c#Winform自定义控件-进度条
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- 小白学Python(1)——安装与调试,“你好,世界”,“hello,world”
之前从没接触过编程之类的东西,在网上下载个自己需要的软件真实比较麻烦,找了半天总是没有合适的,好不容易找到了,不过那家公司已经倒闭了,软件不更新也运行不了了,于是乎,求人不如求己,自己没事编程吧. 在 ...
- C# ModBus 读取数据
简单介绍: 项目上需要与多家公司做接口对接.我们提供接口的有,其他公司提供的接口也有.所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了IP.端口 ...
- 一文搞懂Python中的所有数组数据类型
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- python 32 操作系统与进程
目录 1. 操作系统 1.1 作用 1.2 操作系统的发展 2. 进程的理论 2.1 相关名词 2.2 进程的创建 2.3 进程的状态: 1. 操作系统 管理.控制.协调计算机硬件与软件资源的计算 ...
- hibernate 报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
解释:JavaBean的主键类型只能是int类型,因为在映射关系配置是自动增长的,String类型是不能自动增长的,所以会报错.
- Python基础 2-2 列表的实际应用场景
引言 本章主要介绍列表在实际应用中的使用场景,多维列表(嵌套列表) 如果你需要在列表保存每个人员的一些基本信息,使用列表嵌套来保存这种信息是个不错的主意. 多维列表 列表可以根据实际情况嵌套使用,比如 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- CodeForces 1082 G Petya and Graph 最大权闭合子图。
题目传送门 题意:现在有一个图,选择一条边,会把边的2个顶点也选起来,最后会的到一个边的集合 和一个点的集合 , 求边的集合 - 点的集合最大是多少. 题解:裸的最大权闭合子图. 代码: #inclu ...
- 现代 JavaScript 教程到底是什么?
手册与规范 <现代 JavaScript 教程>是开源的现代 JavaScript 从入门到进阶的优质教程,它旨在帮助你逐渐掌握 JavaScript 这门语言.但是一旦你已经熟悉了这门语 ...