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 ...
随机推荐
- Win32中 DLL、Lib 库的创建机器使用
Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...
- 手撸HashMap实现
前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的Hash ...
- Linux之iptables(三、命令--->单主机)
iptables命令规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname ...
- python BeautiulSoup
==============================================查找网页中<a>标签中的链接from bs4 import BeautifulSoup with ...
- 6 DataFrame处理丢失数据--数据清洗
处理丢失数据 有两种丢失数据: · None · np.nan(NaN) 1 None None是Python自带的,其类 ...
- IE7浏览器下去除flash动画边框问题
<object width="100%" height="100%" data="/templates/default/swf/guide.sw ...
- 关于PyQt5,在pycharm上的安装步骤及使用技巧
前序 之前学习了一款GUI图形界面设计的Tkinter库,但是经大佬的介绍,PyQT5全宇宙最强,一脸的苦笑 毫不犹豫的选择转战PyQT5,在学习之前需要先安装一些必须程序,在一番查阅后,发现PyQt ...
- linux系统读写缓存
1. 操作系统缓存 在linux世界里,一切可读写设备都可看作是文件.文件cache设计的好坏直接影响着文件系统和磁盘的性能.最直观的是使用free命令看到的cached列. 这里面的cached列 ...
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例
今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...
- Unity3D中的Coroutine具体解释
本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...