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——函数-箭头函数
箭头函数: 1.普通函数 function 函数名(){...} 2.箭头函数 注意: 1)如果只有一个返回值,{}return可以省略: let arr = [12,5,8,99,33,14,26 ...
- k8s阅读笔记1-云原生
前言 阅读书籍地址https://rootsongjc.gitbooks.io/kubernetes-handbook/content/cloud-native/cloud-native-defini ...
- pyc文件是什么
pyc 是一种二进制文件,是由 py 文件经过编译后,生成的文件,是一种 bytecode,py 文件变成 pyc 文件后,加载的速度有所提高,而且 pyc 是一种跨平台的字节码,是由 Python ...
- hive中Sort By,Order By,Cluster By,Distribute By,Group By的区别
order by: hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...
- Redis Key过期事件
解决方案1: 可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态,如果未支付,则进行处理但是key过期了redis有通知吗?答案是肯定 ...
- java生成随机数方法
java生成随机数方法: String random = String.valueOf(new Random().nextInt(9000)); String timestamp = String.v ...
- SpringBoot JSON文件读取
@Componentpublic class StepExecutor implements Runnable { @Value("classpath:menu.json") pr ...
- 【转】跨域资源共享 CORS 详解
本文来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 阮一峰老师的网络日志 CORS是一个W3C标准,全称是"跨域资源共享"( ...
- webpackES6语法转ES5语法
安装babel-loader: npm install --save-dev babel-loader@7 babel-core babel-preset-es2015 webpack.config. ...
- 英语单词contributors
contributors 来源——github网站 翻译 n. 贡献者:参与者:编著者(contributor的复数形式) TOEFL | GMAT 词根:cont ...