使用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. 20191114PHP图像绘制

    <?phpob_clean();$img=imagecreate(400,400);$back=imagecolorallocate($img,200,200,100); $blue=image ...

  2. 常见前端HTML5面试题

    1.H5新标签新特性 新标签:header,nav,footer,aside,article,section,Canvas,audio,video 新特性:localStorag, sessionSt ...

  3. elasticsearch 深入 —— Search After实时滚动查询

    Search After 一般的分页需求我们可以使用form和size的方式实现,但是这种分页方式在深度分页的场景下应该是要避免使用的.深度分页会随着请求的页次增加,所消耗的内存和时间的增长也是成比例 ...

  4. NVIDIA Jetson™ TX1

    NVIDIA® Jetson TX1 是一台模块式计算机,代表了视觉计算领域近20年的研发成就,其尺寸仅有信用卡大小.Jetson TX1 基于崭新 NVIDIA Maxwell™ 架构,配有256个 ...

  5. CS184.1X 计算机图形学导论 HomeWork1

    最容易填写的函数就是left.输入为旋转的角度,当前的eye与up这两个三维向量 void Transform::left(float degrees, vec3& eye, vec3& ...

  6. mysql安装 demo [linux centos7] [5.7.26]

    MySQL 安装配置 https://www.runoob.com/linux/mysql-install-setup.html =================================== ...

  7. 15_1.InetAddress

    import java.net.InetAddress; import java.net.UnknownHostException; public class InetAdressTest { pub ...

  8. Linux批量新建文件夹(大括号表达式的应用)

    如果想要批量新建文件夹来存放照片,按照年份和月份,格式为YYYY-MM.可以使用下面命令批量新建: mkdir {2007..2009}-{01..12} 结果如下: 2007-01 2007-07 ...

  9. 51nod 1831: 小C的游戏(Bash博弈 找规律)

    题目链接 此类博弈不需要考虑sg函数,只需要确定必胜态和必败态,解题思路一般为打败先打表找规律,而后找规律给出统一的公式.打表方式:给定初始条件(此题中为ok[0]=ok[1]=0),然后从低到高枚举 ...

  10. 51nod 1714:B君的游戏(博弈 sg打表)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #incl ...