使用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反射-学习的更多相关文章

  1. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  2. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  3. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  4. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  5. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射学习笔记

    1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...

  9. Java反射学习(java reflect)(二)

    ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...

  10. JAVA反射学习网摘

    程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...

随机推荐

  1. idea 创建 SSM + maven Java Web 项目流程

    idea 创建 SSM + maven Java Web 项目流程 一.idea 中选择File,New Project 新建项目 二.选择Maven,勾选上面的Create from archety ...

  2. JavaScript中的柯里化

    转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...

  3. Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)

    在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没 ...

  4. 安装Sublime Text 3 的过程

    在Sublime Text官网下载最新的APP https://www.sublimetext.com 我下载的是 3143 安装之后开始在网上找注册码 我用了成功的注册码的是 这个应该是单个用户的, ...

  5. vue,一路走来(11)--HTML5 History模式

    HTML5 History模式 项目中我用的是history模式. 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不 ...

  6. 微信小程序swiper组件实现图片宽度自适应

    wxml 代码: <!--pages/swipe/swipe.wxml--> <view> <swiper circular="true" indic ...

  7. bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元

    基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 151 ...

  8. python基础:6.python最大的递归层数

    python解释器版本:3.7 def recursion(n): print(n) n += 1 recursion(n) recursion(1) # maximum recursion dept ...

  9. C#基础提升系列——C#委托

    C# 委托 委托是类型安全的类,它定义了返回类型和参数的类型,委托类可以包含一个或多个方法的引用.可以使用lambda表达式实现参数是委托类型的方法. 委托 当需要把一个方法作为参数传递给另一个方法时 ...

  10. docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...