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有着一个非常突出的动 ...
随机推荐
- idea 创建 SSM + maven Java Web 项目流程
idea 创建 SSM + maven Java Web 项目流程 一.idea 中选择File,New Project 新建项目 二.选择Maven,勾选上面的Create from archety ...
- JavaScript中的柯里化
转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...
- Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)
在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没 ...
- 安装Sublime Text 3 的过程
在Sublime Text官网下载最新的APP https://www.sublimetext.com 我下载的是 3143 安装之后开始在网上找注册码 我用了成功的注册码的是 这个应该是单个用户的, ...
- vue,一路走来(11)--HTML5 History模式
HTML5 History模式 项目中我用的是history模式. 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不 ...
- 微信小程序swiper组件实现图片宽度自适应
wxml 代码: <!--pages/swipe/swipe.wxml--> <view> <swiper circular="true" indic ...
- bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元
基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1 5 16 45 121 320 841 2205 5776 151 ...
- python基础:6.python最大的递归层数
python解释器版本:3.7 def recursion(n): print(n) n += 1 recursion(n) recursion(1) # maximum recursion dept ...
- C#基础提升系列——C#委托
C# 委托 委托是类型安全的类,它定义了返回类型和参数的类型,委托类可以包含一个或多个方法的引用.可以使用lambda表达式实现参数是委托类型的方法. 委托 当需要把一个方法作为参数传递给另一个方法时 ...
- docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...