java反射-学习
时间:2019-06-12
本文章向大家介绍java反射-学习,主要包括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); }
原文地址:https://www.cnblogs.com/nxzblogs/p/10938182.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android Selector获取焦点后文本背景修改的实现代码
- 基于SceneForm实现子弹射击(绘制子弹运行轨迹)
- android实现清理缓存功能
- Android实现 Shape属性gradient 渐变效果
- 1K GitHub star+ 的项目是如何炼成的?
- Android属性动画实现图片从左到右逐渐消失
- Android实现清除应用缓存功能
- VBlog的代码结构,使用vue-element,vue-vant组件开发的纯前端博客
- Android仿微信视屏悬浮窗效果
- Android仿QQ可拉伸头部控件
- android使用surfaceview+MediaPlayer播放视频
- Android性能之冷启动优化详析
- Android自定义View实现地铁显示牌效果
- Android自定义控件实现望远镜效果
- Android自定义View实现点赞控件