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 ...
随机推荐
- git连接github mac
话不多说,终端里的代码直接复制过来 Last login: Fri May 17 21:45:31 on ttys000 liuduoduodeMacBook-Air:~ liuxiangyang$ ...
- java折半插入排序
代码如下: public class BinaryInsertSort { public static void binaryInsertSort(DataWrap [] data) { System ...
- 简单的SpringBoot环境搭建
开始搭建前请确认您的计算机中的Maven已正确配置 一:使用IDEA创建一个Maven项目,图中第一个指针请选择自己正在使用的JDK版本,指针二请打勾,选中指针三所指向的类型并点击Next 二:填写G ...
- python基础 条件和循环
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- M - Substrings
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X ...
- Hibernate 之QBC
转自:http://blog.csdn.net/agromach/article/details/1932290 一.Hibernate 中聚合函数的使用 Criteria接口的Projections ...
- springmvc 处理lsit类型的请求參数映射成实体属性
<table align="center" cellspacing="10"> <tr> <td> 母码数目:<inp ...
- linux下jdk的安装和配置
一.首先依据自己的系统位数在网上下载对应的jdk安装包 下载地址例如以下:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-do ...
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
此处共同拥有两段代码: 一. 这段代码比較全面,当中參考了github上的相关源代码. 能够说功能强大. //Dijkstra(迪杰斯特拉算法) #include <stdio.h> #i ...
- machine learning in coding(python):使用贪心搜索【进行特征选择】
print "Performing greedy feature selection..." score_hist = [] N = 10 good_features = set( ...