Java关于反射的用法
一. 首先是准备一个需要反射的类
public class Person {
private String name;
private int age;
public String sex;
public int tel;
private Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public Person(String name, int age, String sex, int tel) {
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
}
public String showInfo() {
return "name:" + name + "-age:" + age + "-sex:" + sex + "-tel" + tel;
}
private String getName() {
return name;
}
}
二.现在开始使用反射
/**
* 获取一个类的Class对象方法
*
* @param view
* @throws Exception
*/
public void getClassMethod(View view) throws Exception {
//获取class对象有三种方法 Person person = new Person();
//第一种
Class class1 = person.getClass();
//第二种
Class class2 = Person.class;
//第三种
Class class3 = Class.forName("com.adminhj.httpexercise.reflect.Person"); Log.i(TAG, "class1==class2-->" + (class1 == class2));
Log.i(TAG, "class2==class3-->" + (class2 == class3)); }
打印的结果是:
com.adminhj.httpexercise.reflect.ReflectActivity: class1==class2-->true
com.adminhj.httpexercise.reflect.ReflectActivity: class2==class3-->true
/**
* 通过反射获取Person类的共有构造方法
*
* @param view
*/
public void getConstruct(View view) throws Exception {
//加载person类的class对象
Class class1 = Class.forName("com.adminhj.httpexercise.reflect.Person");
//获取指定的构造方法 public Person(String name, int age, String sex, int tel)
// ,如果构造方法中没有参数可不要写如例如 Constructor constructor = class1.getConstructor();
Constructor constructor = class1.getConstructor(String.class, int.class, String.class, int.class);
//new出指定构造方法的对象
Object obj = constructor.newInstance("张三", , "男", );
//获取反射类中的公共属性
Field sex = class1.getField("sex");
Field tel = class1.getField("tel");
Log.i(TAG, "sex:" + sex.get(obj) + "-------tel:" + tel.get(obj));
//获取反射类中指定的的公共方法
Method showInfo = class1.getMethod("showInfo");
//执行方法
String info = (String) showInfo.invoke(obj);
Log.i(TAG, "info" + "-------" + info); }
打印结果:
com.adminhj.httpexercise.reflect.ReflectActivity: sex:男-------tel:
com.adminhj.httpexercise.reflect.ReflectActivity: info-------name:张三-age:-sex:男-tel110
/**
* 通过反射获取Person类的私有构造方法
*
* @param view
* @throws Exception
*/
public void getDeclaredConstruct(View view) throws Exception {
//加载person类的class对象
Class class1 = Class.forName("com.adminhj.httpexercise.reflect.Person");
//获取指定的构造方法 private Person(String name, int age)
Constructor constructor = class1.getDeclaredConstructor(String.class, int.class);
//设置这个私有的构造方法是可进入的,不设置则会报错
constructor.setAccessible(true);
//创建实例对象
Object obj = constructor.newInstance("里斯", ); //获取所有属性包括私有,class1.getDeclaredField() 此方法是获取所有属性不包括私有
//
Field[] declaredFields = class1.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true); //注释掉的是在使用私有熟悉的时候需要注意的
//field.setAccessible(true); 设置属性可见
//field.set(obj, "张飞"); 给属性赋值 Log.i(TAG, field.getName() + "-------" + field.get(obj));
}
//获取反射类中指定的的私有方法
Method getNameAndAge = class1.getDeclaredMethod("getNameAndAge");
//设置私有方法可执行
getNameAndAge.setAccessible(true);
//执行方法
String result = (String) getNameAndAge.invoke(obj); Log.i(TAG, result);
}
打印结果:
com.adminhj.httpexercise.reflect.ReflectActivity: age-------
com.adminhj.httpexercise.reflect.ReflectActivity: name-------里斯
com.adminhj.httpexercise.reflect.ReflectActivity: sex-------null
com.adminhj.httpexercise.reflect.ReflectActivity: tel-------
com.adminhj.httpexercise.reflect.ReflectActivity: name=里斯----------age=
学无止尽 小伙伴们加油哦
Java关于反射的用法的更多相关文章
- Java之反射 — 用法及原理
Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- Java反射的用法
Class类 在Java中,每个class都有一个相应的Class对象.也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息. 反射 ...
- Java 递归 反射 正则表达式
一 递归 1. 就是函数自身调用自身 (就是在栈内存中不断的加载同一个函数) 2. 什么时候用递归呢? 当一个功能被重复使用 而每一次使用该功能时的参数不确定 都由上次的功能元素结果来确定 简单说: ...
- Java的反射机制和动态代理
介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...
- java的反射机制(重要)
1,反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- Java学习——反射
Java学习——反射 摘要:本文主要讲述了什么是反射,使用反射有什么好处,以及如何使用反射. 部分内容来自以下博客: https://www.cnblogs.com/tech-bird/p/35253 ...
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
随机推荐
- Light Oj - 1134 Be Efficient
题目传送门:Be Efficient 题意:输入n和m,然后输入有n个元素的一个序列,问有多少个子序列元素的和能整除m. 思路:求前缀和,利用一个前缀的一个定理求解. 前缀和的一个定理是:每次求的前缀 ...
- ORM 进阶操作
ORM多表操作 一.创建模型 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息:作者详情模型和作者模型之间是一对一的关系. 出版商模型:出版商有 ...
- 第七节:numpy之矩阵及特殊矩阵的创建
- Python基础-while
使用while循环实现输出2-3+4-5+6.....+100的和. i = 2 sum=0 while i<=100: if i % 2 == 0: sum += i else: sum -= ...
- 《你说对就队》第八次团队作业:Alpha冲刺 第五天
<你说对就队>第八次团队作业:Alpha冲刺 第五天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...
- 学习Spring框架等技术的方向、方法和动机
学习Spring框架最早学习Spring框架是在大二的时候,当时看了几本书,看了一些视频,主要是传智播客的.更多的,还是写代码,单独写Spring的,也有与Struts和Hibernate等框架整合的 ...
- webstorm+nodejs环境中安装淘宝镜像
用过nodejs的人都知道,从node的官方模板库下载依赖包的时候,经常会遇到“假死”(页面静止不动)的状态,这种速度简直要逼死焦急地等待下班的人.还好咱们万能的淘宝提供了淘宝镜像这么一个不要更好用的 ...
- JSTL 实现 为Select赋多个值
需要注意需要在.jsp文件中引入相应的类库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core ...
- deepin下使用python遇到的一些情况
1.系统自带python2.7和python3.5,直接运行python默认的是2.7版本的 当然直接运行python的默认版本是可以修改的,参考这里 然后可能需要3.6版本的话,就直接在命令行输入 ...
- springboot之多任务并行+线程池处理
最近项目中做到一个关于批量发短信的业务,如果用户量特别大的话,不能使用单线程去发短信,只能尝试着使用多任务来完成!我们的项目使用到了方式二,即Future的方案 Java 线程池 Java通过Exec ...