java 反射基础_Java基础教程:反射基础
Java基础教程:反射基础
引入反射
反射是什么
能够动态分析类能力的程序称为反射。反射是一种很强大且复杂的机制。
Class类
在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个对象追踪着每个对象所属的类。虚拟机利用运行时类的信息选择相应的方法执行。
我们可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。
直接获取
Class cl1 =Date.class;
Class cl2 = Integer.class;
根据对象获得类信息
MyClass myClass;
.....
Class cl = myClass.getClass();
cl.getName(); //获得类名
调用静态方法forName获得类名相应的Class对象。
String className = 'java.util.Date';
Class cl = Class.forName(className);
注意:
虚拟机为每一个类型管理一个Class对象。因此使用==可以实现两个类对象比较的操作。
利用反射分析类的能力
API函数举例
getDeclaredFields():获得此类对象所表示的类或接口所声明的所有字段。
getFields():输出类以及其所继承的父类的 public 字段
getDeclaredMethods():获得此类对象所表示的类或接口所声明的所有方法,包括公共、保护、私有但不包括继承。
getDeclaredConstructors() :返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
getName():获得此class所表示实体的名称。
示例:输出字段
GetFields只会输出publicStr,GetDeclaredFields则会忽略访问控制符输出所有字段!
public class MyClass{
public String publicStr;
private String privateStr;
protected String protectedStr;
public static void main(String[] args) {
//获取Class类
Class c1 = MyClass.class;
//调用GetFields()
for(Field field : c1.getFields()){
System.out.println(field.getName());
}
System.out.println("=============");
//调用GetDeclaredFields()
for(Field field : c1.getDeclaredFields()){
System.out.println(field.getName());
}
}
}
示例:输出方法
getDeclaredMethods只会输出本类的所有方法!
public class MyClass{
public void publicFun(int a){}
private void privateFun(int a){}
protected void protectFun(int a){}
public static void main(String[] args) {
//获取Class类
Class c1 = MyClass.class;
//2.1 获取所有 public 访问权限的方法
//包括自己声明和从父类继承的
//Method[] mMethods = c1.getMethods();
//2.2 获取所有本类的的方法(不问访问权限)
Method[] mMethods = c1.getDeclaredMethods();
//3.遍历所有方法
for (Method method :
mMethods) {
//获取并输出方法的访问权限(Modifiers:修饰符)
int modifiers = method.getModifiers();
System.out.print(Modifier.toString(modifiers) + " ");
//获取并输出方法的返回值类型
Class returnType = method.getReturnType();
System.out.print(returnType.getName() + " "
+ method.getName() + "( ");
//获取并输出方法的所有参数
Parameter[] parameters = method.getParameters();
for (Parameter parameter :
parameters) {
System.out.print(parameter.getType().getName()
+ " " + parameter.getName() + ",");
}
//获取并输出方法抛出的异常
Class[] exceptionTypes = method.getExceptionTypes();
if (exceptionTypes.length == 0) {
System.out.println(" )");
} else {
for (Class c : exceptionTypes) {
System.out.println(" ) throws "
+ c.getName());
}
}
}
}
}
调用getDeclaredMethods输出结果:
public static void main( [Ljava.lang.String; arg0, )
protected void protectFun( int arg0, )
private void privateFun( int arg0, )
public void publicFun( int arg0, )
调用getMethods输出结果:
public static void main( [Ljava.lang.String; arg0, )
public void publicFun( int arg0, )
public final void wait( ) throws java.lang.InterruptedException
public final void wait( long arg0,int arg1, ) throws java.lang.InterruptedException
public final native void wait( long arg0, ) throws java.lang.InterruptedException
public boolean equals( java.lang.Object arg0, )
public java.lang.String toString( )
public native int hashCode( )
public final native java.lang.Class getClass( )
public final native void notify( )
public final native void notifyAll( )
在运行时使用反射分析对象
API函数举例
setAccessible(boolean flag):为反射对象设置可访问标志。为true使得对象的私有属性也可以被查询和设置。
getField(): 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
get(Object obj):返回对象中用Field对象表示的域值。
set(Object obj,Object newValue):用一个新值设置Obj对象中的Field对象表示的域。
示例:获取并设置对象的私有字段值
public class MyClass{
private String context = "Hello World";
public static void main(String[] args) {
//获取Class类
Class c1 = MyClass.class;
try {
//构建对象
Object myClass = c1.newInstance();
//获取私有变量
Field context = c1.getDeclaredField("context");
//获取私有变量访问权
context.setAccessible(true);
//访问私有变量值
System.out.println(context.get(myClass));
//设置私有变量值
context.set(myClass, "Hi Boy!");
System.out.println(context.get(myClass));
} catch (Exception e) {
e.printStackTrace();
}
}
}
利用反射调用任意方法
API函数说明
public Object invoke(Object obj,Object... args)
参数:obj - 从中调用底层方法的对象args - 用于方法调用的参数
返回:使用参数 args 在 obj 上指派该对象所表示方法的结果
示例:调用私有方法
public class NCConfgCliService {
private void privateFun(int a){
System.out.println(a);
}
public static void main(String[] args) {
//获取Class类
Class c1 = NCConfgCliService.class;
try {
//获取私有方法
Method privateMethod = c1.getDeclaredMethod("privateFun",int.class);
//创建类的实例
Object obj = c1.newInstance();
//调用私有方法
privateMethod.invoke(obj,10);
} catch (Exception e) {
e.printStackTrace();
}
}
}
java 反射基础_Java基础教程:反射基础相关推荐
- sql数据库教程百度云_【推荐】零基础水彩画入门教程|零基础水彩教程百度云...
零基础水彩画入门教程|零基础水彩教程百度云! 照着教程画却总是画不好,这些水彩技法你真的学会了吗? 盲目地照着葫芦画瓢,不懂控制确实很难学会,可以关注一下公众号:每日学绘画,可以领取水彩电子书和全套视 ...
- matlab基础与实例教程,MATLAB基础与实例教程
系统全面,实例丰富 考虑到Matlab进行仿真和运算分析时的基础知识和实践操作,讲解从基础的变量.函数.数据类型等入手,涉及到数学分析.图形可视化.Simulink仿真.文件读写等,全面地介绍了Mat ...
- 计算机网络基础及应用教程,计算机网络基础及应用教程
摘要: <高等学校文科类专业"十一五"计算机规划教材:计算机网络基础及应用教程>为教育部高校文科计算机教学指导委员会的课程改革立项教材,其特色是以计算机网络技术应用能力 ...
- java泛型怎么用反射生成_Java 之 使用反射生成并操作对象
一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...
- java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
用JAVA SWING实现的捕鱼教程 开发工具:ECLIPSE 实现技术:JAVA SWING 用到的JAR包:xmlpull_1_1_3_4c.jar.dom4j-1.6.1.jar.jl1.0.j ...
- java中sping基础_Java回顾之Spring基础
这一篇主要讲Spring一些基础的内容. 概述 Spring 是一个非常火的框架,尤其是在Web开发领域,和Struts以及Hibernate构成了SSH三剑客.当时Web开发的另一个组合是LAMP, ...
- java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔
***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...
- java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题
一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...
- java负零_java数据结构从零基础到负基础
第一章 基础 1.3.32 栈与队列融合的数据结构:链表实现 1.接口public interface ISteque { /** * 进栈 * @param val 进栈元素 */ void pus ...
- java session使用_java学习之web基础(8):使用session实现带验证码的登录功能
login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...
最新文章
- python使用笔记:sys.argv[]的使用
- kubernetes环境下私有仓库搭建
- 成功解决from scipy.linalg import _fblas ImportError: DLL load failed: 找不到指定的模块。
- C语言再学习 -- 位、字节、字、字长、字元的关系
- OpenGL创建窗口
- 畅通工程,How Many Tables ACM第九天-图论
- 字符串中最后一个单词长度
- 系列(七)—测试用例设计
- 关于jHipster框架在构建中的出现的error修复
- leetcode面试题 02.08. 环路检测
- 谷歌 Provisional headers are shown 和360急速模式 网络连接错误
- CCF201703-3 Markdown(100分)【文本处理】
- Pytorch——神经网络工具箱nn
- Python机器学习库sklearn自动特征选择(训练集)
- hrbust 哈理工oj 网线【MST+Prim】
- 最新emoji表情代码大全_8张最新创意好看的早上好表情图片大全 秋日温馨的早安祝福图片带字精选...
- Oracle学习VII —— Oracle建表
- matlab中小波去燥原理,用matlab进行小波去噪的程序
- java三种功能加强模式
- Zookeeper到底是AP还是CP?
热门文章
- oracle8i+下载,oracle database 8i, 9i,10g, 11g正确下载地址
- python image模块需要安装吗_python Image模块安装
- java web 手机验证_JAVA-WEB,好知网,登录注册,手机验证
- android 脚本运行命令大全,【Android】Monkey之命令详解
- c语言转职,魔兽地图:3C转职版5.0C
- ESX/ESXi 主机上的每个插槽中安装了多少内存
- Java开发笔记(五十六)利用枚举类型实现高级常量
- Bootstrap 图片
- 多线程中对全局变量(整型类型)是否需要同步操作
- 阿里云构建Jenkins服务