java反射-学习
使用Java反射机制可以在运行时期获取Java类的信息,可获取以下相关的内容:
Class对象
类名
修饰符
包信息
父类
实现的接口
构造器
方法
变量
注解
简单的反射例子:
1、获取class对象(前提):
Class<Test> testClass = Test.class;
或
Class<?> aClass = Class.forName("com.alibaba.fastjson.JSONObject");
2、获取类名:
String name1 = testClass.getName();
System.out.println("类名:"+name1);
结果:
类名:com.example.demo.Test
3、修饰符
Class<Test> testClass = Test.class;
//当前类的修饰符
int modifiers = testClass.getModifiers();
System.out.println(Modifier.isAbstract(modifiers));
System.out.println(Modifier.isPublic(modifiers));
System.out.println(Modifier.isPrivate(modifiers)); //结果 false
true
false
方法的修饰符
Class<Test> testClass = Test.class;
Method method = testClass.getMethod("getName", new Class[]{});
int modifiers1 = method.getModifiers();
System.out.println(Modifier.isPrivate(modifiers1));
System.out.println(Modifier.isPublic(modifiers1)); //结果
false
true
4、包信息
Class<Test> testClass = Test.class;
Package aPackage = testClass.getPackage();
System.out.println(aPackage); //结果
package com.example.demo
5、父类
Class<Test> testClass = Test.class;
Class<? super Test> superclass = testClass.getSuperclass();
String name = superclass.getName();
System.out.println(name); //结果
java.lang.Object
6、实现的接口
Class<Test> testClass = Test.class;
Class<?>[] interfaces = testClass.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println(anInterface.getName());
} //test类没有实现接口 ,interfaces为空数组
7、构造器(获取public共有修饰符的构造方法)
Class<Test> testClass = Test.class;
Constructor<?>[] constructors = testClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
} //结果 com.example.demo.Test

例子:
Class<Test> testClass = Test.class;
Constructor<Test> constructor = testClass.getConstructor();
Test test = constructor.newInstance();
System.out.println(test.delete()); //结果
delete
8、获取变量和方法
package com.example.demo; import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Test {
public static void main(String[] args) { //获取属性
Field[] fields = Test.class.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
} System.out.println("属性==================方法");
Method[] methods = Test.class.getMethods();
for (Method method : methods) {
String name = method.getName();
System.out.println(name);
}
} private String name;
private String sex; public String delete() {
return "delete";
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
}
}
输出结果:
name
sex
前边为属性==================后边为当前类的所有的方法方法(保存从父类那继承来的方法)
main
getName
delete
setName
getSex
setSex
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll

例子:
Class<Test> testClass = Test.class;
//获取的方法是没有参数的,所以下边这个第二个参数就可以设置为null
Method getName = testClass.getMethod("getName", null);
//set方法只有一个参数,下班这个方法的第二个参数就是string.class
Method setName = testClass.getMethod("setName", String.class);
//假如一个方法有两个参数,则需要如下设置第二个参数
Method setSex = testClass.getMethod("setSex", new Class[]{String.class, String.class});
获取一个方法的参数类型:
Class<Test> testClass = Test.class;
Method method = testClass.getMethod("getName", null);
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println(parameterType.getName());
}
后去一个方法的返回类型:
Class<Test> testClass = Test.class;
Method method = testClass.getMethod("getName", null);
Class<?> returnType = method.getReturnType();
System.out.println(returnType.getName()); //结果 getname方法的返回值的类型为string
java.lang.String
通过method调用方法:如果执行的是静态方法,的method.invoke方法的第一个参数可以设置为null,第二个参数为方法执行需要的实参
Test t = new Test();
t.setName("aaaaa");
Class<? extends Test> testClass = t.getClass();
Method method = testClass.getMethod("getName",null);
String invoke = (String)method.invoke(t,null);
System.out.println(invoke);
****Method.setAcessible(true)这行代码,通过调用setAccessible()方法会关闭指定类的Method实例的反射访问检查
9、注解
Class<Test> testClass = Test.class;
Annotation[] annotations = testClass.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
java反射-学习的更多相关文章
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- Java 反射学习笔记
要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...
- Java反射学习:深入学习Java反射机制
一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- java反射学习笔记
1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...
- Java反射学习(java reflect)(二)
ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...
- JAVA反射学习网摘
程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...
随机推荐
- 前端 ----- 初探ES6 Promise
前段时间做项目,在调用接口的时候,遇到了异步问题.开始是使用定时器,发现效果并不理想,于是又用了回调,效果还好但是,很明显的影响了代码的整洁性. 于是我想起了在面试的那段时间,背过的面试题里,出现过一 ...
- 纯手动拉WebPanel页面保存出现错误提示 "error:字符文本中的字符太多"
环境为.Net 没有使用WorkWithPlus 纯手拉WebFrom页面 问题出现情况如下:在拉页面的过程中拖了3个Value类型的变量到Table中 页面如下 但是在我保存的时候 发现提示如下错 ...
- 基于TI 多核DSP 的大数据智能计算处理解决方案
北京太速科技有限公司 大数据智能计算,是未来的一个发展趋势,大数据计算系统主要完成数据的存储和管理:数据的检索与智能计算. 特别是在智能城市领域,由于人口聚集给城市带来了交通.医疗.建筑等各方面的压力 ...
- CS184.1X 计算机图形学导论(第三讲)
第一单元(介绍关于变换的数学知识) :基本二维变换 模型坐标系,世界坐标系 1.缩放 Scale(规模,比例) Sx表示在x方向上放大的倍数,Sy表示在y方向上放大的倍数,因此X坐标乘以Sx,Y坐标乘 ...
- ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题
ltp-ddt eth_iperf_tcp server端:iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来: iperf -c 1921.68.40.41 -m -M ...
- Hadoop的配置文件
hadoop-env.sh:脚本中所用到的环境变量,以运行Hadoop mapred-env.sh:脚本中所用到的环境变量,以运行mapreduce yarn-env.sh:脚本中所用到的环境变量,以 ...
- Vue学习笔记-父子通信案例
<div id="app"> <cpn :number1="num1" :number2="num2" @num1chan ...
- RabbitMQ之交换机
1. 交换机类型 rabbitmq常见有四种交换机类型: direct, topic, fanout, headers. 一般headers都不用,工作中用得较多的是fanout,它会将消息推送到所有 ...
- SaltStack(自动化运维工具)
SaltStack管理工具允许管理员对多个操作系统创建一个一致的管理系统,包括VMware vSphere环境.SaltStack作用于仆从和主拓扑.SaltStack与特定的命令结合使用可以在一个或 ...
- SQLserver查询作业、视图、函数、存储过程中的关键字
一.查询视图.函数.存储过程中的关键字 SELECT a.name,a.[type],b.[definition] FROM sys.all_objects a,sys.sql_modules b W ...