Java 学习之反射机制“解刨”分解类,并获取内容!
正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了)。下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看。
原理分析:
所谓反射就是将一个类当做我们研究的对象,进行分解,获取其中的内容的过程。其核心就是Class类,他是所有类的研究的对象,基于Class我们就可以获取一个类的字节码,进而获取想要的值。
目标类(待解刨的类)
package reflect;
public class Person {
public Person(){}
private String name;
public int address;
public int getAddress() {
return address;
}
public void setAddress(int address) {
this.address = address;
}
public void setName(String name) {
this.name = name;
}
public Person(String name ){
this.name = name;
}
public String getName(){
return this.name;
}
private Person(int name){
System.out.println("这里是私有的带有参数的构造方法!");
}
public void eat(){
System.out.println("吃饭!");
}
public void drink(String name){
System.out.println("正在喝 :"+ name);
}
public void purchase(String address ,int [] number , String [] item){
System.out.println("这个人在 " + address +" 买了 "+item +" 分别 "+ number+" 个!");
}
private String flay(String tool){
return "I Can Flay By "+ tool;
}
public static String spend(String money){
System.out.println("我只能够花费 "+money +"钱!");
return "你造吗?";
}
public static void main(String[] args) {
System.out.println(args[0]);
}
}
反射构造方法小例子
package reflect;
import java.lang.reflect.Constructor;
import org.junit.Test;
public class ReflectConstructor {
/**
* 反射得到无参的构造函数的方法
* @throws Exception
*/
@Test
public void reflect1() throws Exception{
Class cls = Class.forName("reflect.Person");
Constructor c = cls.getConstructor(null);
Person person = (Person) c.newInstance(null);
System.out.println("反射得到的结果是:"+ person.toString());
}
/**
* 反射出带有参数的构造方法
* @throws Exception
*/
@Test
public void reflect2() throws Exception {
Class cls = Class.forName("reflect.Person");
Constructor c = cls.getConstructor(String.class);
Person person = (Person) c.newInstance("Name");
System.out.println("反射获得的有参的结果是:"+ person.getName());
}
/**
* 反射出私有的带有参数的构造方法
* @throws NoSuchMethodException
* @throws Exception
*/
@Test
public void reflect3() throws NoSuchMethodException, Exception {
Class cls = Class.forName("reflect.Person");
Constructor c = cls.getDeclaredConstructor(int.class);
//java语言默认私有的方法是不能被外界访问的到的,但要进行强制的访问需要加上一层权限
c.setAccessible(true);
Person person = (Person) c.newInstance(201492115);
System.out.println("反射出私有的带有参数的构造方法!"+ person.toString());
}
}
反射所有方法的小例子
package reflect;
import java.lang.reflect.Method;
import org.junit.Test;
public class ReflectMethods {
/**
* 反射测试一个无参的方法
* public void eat()
* @throws Exception
*/
@Test
public void feflect1() throws Exception {
Class cls = Class.forName("reflect.Person");
Method method =cls.getMethod("eat", null);
System.out.println(method.toString());
method.invoke(new Person(), null);
method.invoke(cls.newInstance(), null);
}
/**
* 反射测试一个带有参数的方法
* public void drink(String name)
* @throws Exception
*/
@Test
public void reflect2() throws Exception {
Class cls = Class.forName("reflect.Person");
Method method =cls.getMethod("drink", String.class);
System.out.println(method.toString());
method.invoke(new Person(), "中国凉茶");
method.invoke(cls.newInstance(), "中国凉茶");
}
/**
* 反射测试含有多个复杂类型的参数的方法
* public void purchase(String address ,int [] number , String [] item)
* @throws Exception
*/
@Test
public void reflect3() throws Exception {
Class cls = Class.forName("reflect.Person");
Method method = cls.getMethod("purchase", String.class,int[].class,String[].class);
method.invoke(cls.newInstance(), "大连",new int[]{1,2,3},new String[]{"鱿鱼","贝壳","螃蟹"});
}
/**
* 反射测试一个带有返回值的不含参数的方法
* public String getName()
* @throws Exception
*/
@Test
public void reflect4() throws Exception {
Class cls = Class.forName("reflect.Person");
Method method = cls.getMethod("getName", null);
String result = (String) method.invoke(cls.newInstance(), null);
System.out.println("测试带有返回值的无参的方法,所得的结果是: "+result);
}
/**
* 反射测试私有含参数的方法
* private String flay(String tool)
*/
@Test
public void reflect5() throws Exception {
Class cls = Class.forName("reflect.Person");
//对于私有的方法只能通过getDeclaredMethod方式得到
Method method = cls.getDeclaredMethod("flay", String.class);
//记得强制将访问人权限提升起来到"可以访问的到"
method.setAccessible(true);
String result = (String) method.invoke(cls.newInstance(), "蝙蝠侠的风衣!");
System.out.println("反射测试私有的含参数的方法的结果是: "+ result);
}
/**
* 反射测试私有的含参数的静态的方法
* public static String spend(String money)
*/
@Test
public void reflect6() throws Exception {
Class cls = Class.forName("reflect.Person");
//对于静态的方法只能通过getDeclaredMethod方式得到
Method method = cls.getDeclaredMethod("spend", String.class);
String result = (String) method.invoke(cls.newInstance(), "100000000000000元人民币!");
System.out.println("反射测试私有的含参数的方法的结果是: "+ result);
}
/**
* 反射测试主方法
* public static void main(String[] args)
* @throws Exception
*/
@Test
public void reflect7() throws Exception {
Class cls = Class.forName("reflect.Person");
Method method = cls.getMethod("main",String[].class);
method.invoke(null, (Object)new String[]{"A","B","C"});
}
}
反射字段值的小例子
package reflect;
import java.lang.reflect.Field;
import org.junit.Test;
public class ReflectField {
/**
* 反射测试字段(属性)的值
* public int address
* @throws Exception
*/
@Test
public void reflect1 () throws Exception {
Class cls = Class.forName("reflect.Person");
Field field = cls.getField("address");
String result = field.getName();
System.out.println("反射所得的字段的结果是:"+result);
}
/**
* 反射测试私有的属性(字段)的结果
* private String name
* @throws Exception
*/
@Test
public void reflect2() throws Exception {
Class cls = Class.forName("reflect.Person");
Field field = cls.getDeclaredField("name");
field.setAccessible(true);
String result = field.getName();
System.out.println("反射测试所得的私有的字段(属性)的值为:"+ result);
}
}
我的总结
- 全部的反射方法均交给JUnit测试通过,并没有发现出错的地方
- 反射是一个比较灵活的方式,具体情况一定要灵活的变通
- 对于私有的变量或者方法,要想访问到其值,就必须打开访问的权限即设置为setAccessable(true);
- 对于框架的运行,需要给出一个类的完整名称(包含完整的包名),这样才不会出错!
Java 学习之反射机制“解刨”分解类,并获取内容!的更多相关文章
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- java学习--Reflection反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- Java学习:反射机制简介
反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- JAVA 学习笔记 - 反射机制
1. JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...
- Java学习笔记-反射机制
Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...
- Java中的反射机制Reflection
目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
随机推荐
- jquery 跨域请求数据问题
昨天参加了一个前端的面试,被问到一个跨域请求数据问题,我们之前一直用的是apicloud的api进行请求的,跨域是被apicloud封装起来的,也就没有注意跨域请求数据的问题.当被问到用jquery跨 ...
- UML总结4---UML九种图关系说明
转自:http://blog.csdn.NET/chenyujing1234/article/details/8173519 UML中包括九种图:用例图.类图.对象图.状态图.时序图.协作图.活动图. ...
- vue之生命周期
vue的生命周期的过程提供了我们执行自定义逻辑的机会,好好理解它的生命周期,对我们很有帮助. 1.vue实例的生命周期(vue2.0) 2.生命周期描述:(参考截图) 3.例子 window.vm = ...
- Algorithm in Practice - Sorting and Searching
Algorithm in Practice Author: Zhong-Liang Xiang Date: Aug. 1st, 2017 不完整, 部分排序和查询算法, 需添加. Prerequisi ...
- jenkins + pipeline构建自动化部署
一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...
- Python OptionParser 使用详解(转载)
Python使用命令行参数能使处理流程更自动化. 链接的内容讲解得十分详细:https://www.tuicool.com/articles/rUvIbi
- CMCC验证绕过POC
大学的时候无意间发现绕过CMCC验证的方法(贫穷使人进步...),写了段POC脚本,时过两年,漏洞应该已经失效了(我猜 --),刚刚发现有人私信问我要,都那么久了鬼还记得写的什么啊,但确实看到了又不能 ...
- AC的故事大结局山寨版(下)(最大流)
福建工程学院第十二届ACM程序设计大赛真题 AC的故事大结局山寨版(下) TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%l ...
- hadoop入门级总结一:HDFS
虽然hadoop经历了多年的发展,作为技术人员都或多或少的使用过或者了解过.这里还是做一个简单的总结,主要原因是之前主要是做hadoop的开发,对hadoop的运维知之甚少,但真正的接触到hadoop ...
- Launcher3 HotSeat显示名称
今天闲的无聊,研究了下launcher代码,看到Hotseat.java的时候,想起来以前有做过显示hotseat中应用名称,因为换了公司代码都没拿出来,就想在试着修改,看了很久发现无从下手,记得ho ...