java 反射(Reflection) 详解

   

 

jAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

  众所周知哈 java ,c++,c#这类语言不属于动态语言;而目前的结论是 在程序运行状态中能允许改变变量类型和程序结构的被称之为动态语言;但是java Reflection 具备看透class 的能力这种能力被称为introspection (内省,内观) (面试重点 需要的同学可以自行百度详细了解一下  我能力有限讲不明白)(只有java  提供反射机制  像c++,c#等 非动态语言没有提供)

java 反射机制提供的功能  (注意:大前提是在运行状态下):

  • 判断任意一个对象所属类
  • 构造任意一个类的对象
  • 判断任意一个类所具有的成员变量和方法
  • 调用任意一个对象的方法

java 反射机制的主要类 主要位于 java.lang.reflet 

  • Class类  代表一个类
  •   Filed类   代表类的成员变量
  •   Method  代表类的方法
  •   Constructor 代表类的构造方法
  •   Array 提供动态创建数组以及访问数组中元素的静态方法

Java 通过反射获取某个类里所有的方法   直接上代码 :

 

java获取class 类的三种方法:

  •  class.froname("类的路径")
  • 类名.class
  • 实例.getclass

    

  /*   实例 操作   */public static void main(String[] args ) throws ClassNotFoundException {/*获得字符串服表示的类的 class 对象*/Class<?> aClass= Class.forName("java.lang.String");/*  可以获取里面 的所有方法  */Method[] methods = aClass.getDeclaredMethods();for(Method method : methods){System.out.println(method);}

结果 :

 java  反射动态的调用某个类的特定的方法  首先要获取该类的Method  方法  对于类的成员变量和构造方法类似  首先要获取 Filed 和 Constroutor

 /*普通方法 */public int add (int a,int b){return  a+b;}public static  void main(String[] args ) throws Exception {/*  通过 .class  方法 获取  该类中的所有对象  */Class<?> aClass = Reflections.class;/* 生成该类的实例化对象 创建一个新的实例 */Object reflection = aClass.newInstance();/*  判断  reflectiong  是否是  Reflections 的实例    返回结果为true */System.out.println( reflection instanceof  Reflections );/* 通过这个类的 getmethod 方法获取到 该类的 add 方法 */Method add = aClass.getMethod("add",new Class[]{int.class,int.class});/*反射方式 操作获取到的方法 */Object result = add.invoke(reflection,new Object[]{1,2});System.out.println((Integer)result); //結果為3 }
            /* 完成对 gflection 的拷贝工作 */public Object copy (Object object) throws Exception {Class<?>  aClass = object.getClass();System.out.println(aClass);/* 获取构造方法 */Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});Object gbj = con.newInstance(new Object[]{"杨一",1});System.out.println(gbj);/*获得独享的所有成员变量*/Field[] fields = aClass.getDeclaredFields();for (Field field :fields){String name = field.getName();System.out.println(name);}return null;}public static void main(String[] args) throws  Exception{Reflections reflections = new Reflections();reflections.copy(new gflection());}}/**/
class  gflection {private  int age;private String name;/*  第一个构造方法 */public gflection(){}/* 带参数的构造方法 */public gflection(String name,int age){this.age = age;this.name = name;}/*get set 方法*/public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}

 

 附上测试代码:

import javafx.scene.effect.Reflection;import javax.xml.ws.spi.Invoker;
import java.io.File;
import java.lang.reflect.*;
/*** Created by 杨一 on 2017/5/4.*/public class Reflections {/* *//*   实例 操作   *//*public static void main(String[] args ) throws ClassNotFoundException {*//*获得字符串服表示的类的 class 对象*//*Class<?> aClass= Class.forName("java.lang.String");*//*  可以获取里面 的所有方法  *//*Method[] methods = aClass.getDeclaredMethods();for(Method method : methods){System.out.println(method);}}*//*       *//*普通方法 *//*public int add (int a,int b){return  a+b;}*//*  public static  void main(String[] args ) throws Exception {*//*  通过 .class  方法 获取  该类中的所有对象  *//*Class<?> aClass = Reflections.class;*//* 生成该类的实例化对象 创建一个新的实例 *//*Object reflection = aClass.newInstance();*//*  判断  reflectiong  是否是  Reflections 的实例    返回结果为true *//*System.out.println( reflection instanceof  Reflections );*//* 通过这个类的 getmethod 方法获取到 该类的 add 方法 *//*Method add = aClass.getMethod("add",new Class[]{int.class,int.class});*//*反射方式 操作获取到的方法 *//*Object result = add.invoke(reflection,new Object[]{1,2});System.out.println((Integer)result); //結果為3}*//* 完成对 gflection 的拷贝工作 */public Object copy (Object object) throws Exception {Class<?>  aClass = object.getClass();System.out.println(aClass);/* 获取构造方法 */Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});Object gbj = con.newInstance(new Object[]{"杨一",1});System.out.println(gbj);/*获得独享的所有成员变量*/Field[] fields = aClass.getDeclaredFields();for (Field field :fields){String name = field.getName();System.out.println(name);}return null;}public static void main(String[] args) throws  Exception{Reflections reflections = new Reflections();reflections.copy(new gflection());}}/**/
class  gflection {private  int age;private String name;/*  第一个构造方法 */public gflection(){}/* 带参数的构造方法 */public gflection(String name,int age){this.age = age;this.name = name;}/*get set 方法*/public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

 

 

 

     

转载于:https://www.cnblogs.com/ykjava/p/6806892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c程序语言设计练习题,C语言程序设计练习题(含程序及参考答案)

《C语言程序设计练习题(含程序及参考答案)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言程序设计练习题(含程序及参考答案)(47页珍藏版)》请在人人文库网上搜索。1、1、定义一个函数int fun(int a,int b,int c)&#xff0c;它的功能是&#xff1a;若a,b,c能构…

终于可以放下心来了,呜呜...

从上周六开始到今天早上&#xff0c;一直在为开题报告的事情受煎熬。想题目想了一天半&#xff0c;实际写出来也就半天的时间差不多&#xff1b;交上去了之后还要担心着是不是会打回来重写。。。呜呼。。。 终于早上等到了回复&#xff0c;得到了自己想听的那些话&#…

mac上安装zookeeper教程

下载 下载tar包解压&#xff0c;推荐使用3.5.9版本&#xff0c;不要使用3.6以上的高版本&#xff0c;它jdk1.8冲突&#xff0c;也不要直接brew install zookeeper--默认最高版本 国内镜像下载地址&#xff1a; http://mirrors.hust.edu.cn/apache/zookeeper/stable/ 下载 ap…

10、自学——Linux的学习进度与任务【用户和用户组相关操作】

用户和用户组相关操作 用户和用户组定义&#xff1a; 用户&#xff1a;资源获取标识符&#xff08;资源分配&#xff09;&#xff0c;是安全权限模型的可信要素之一 用户组&#xff1a;用户组是指多个用户的集合&#xff0c;方便对一类需要同样权限的用户授权 密码&#xff1a;…

c语言构造数据类型有,《c语言程序设计基础7构造数据类型.ppt

《c语言程序设计基础7构造数据类型第7章 构造数据类型 第7章 构造数据类型 第7章 构造数据类型 7.1 构造数据类型概述 构造数据类型是C语言的一个特色&#xff0c;它是由一些简单数据类型构造而来的。 前面所学的数组就是其中最基本的的一种。数组是由若干类型相同的元素构成&a…

在UnitTest中读取*.config文件的郁闷

- -Visual Stuido 2005集成了Unit Test功能后&#xff0c;创建和管理Unit Test变得比原来简单多了&#xff0c;并且独立项目的Unit Test模块和代码不会再"残留"于我们的dll中。不过VS 2005 Unit Test运行方法的原理和其他的Unit Test框架一样&#xff0c;也是使用反射…

Maven属性(properties)标签的使用

在命令行使用属性时&#xff0c;是-D&#xff0c;比如&#xff1a;mvn -Dinputtest 引用官方的说明https://maven.apache.org/pom.html#Properties&#xff1a; Properties 属性是了解POM基础知识的最后一个要素。Maven属性是值占位符&#xff0c;如Ant中的属性。它们的值可以通…

c语言的递归算法流程图,递归算法C语言全解.ppt

递归算法C语言全解第四章 递归算法 【例5】集合的划分 【问题描述】 设S是一个具有n个元素的集合&#xff0c;S&#xff1d;&#xff5b;a1&#xff0c;a2&#xff0c;……&#xff0c;an&#xff5d;&#xff0c;现将S划分成k个满足下列条件的子集合S1&#xff0c;S2&#xff…

Media Player控件常用的样式

1。最常用的&#xff0c;默认的 <object classidCLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 classOBJECT idMediaPlayer width400 height300 ><param nameFilename value"http://www.hubro.net/upload/media/blue-you-make-me-wanna.mp3"></object…

java学习点

第一节&#xff1a;Spring Framework核心技术底层原理详解 1、SpringIOC之Bean生命周期重点步骤详解 2、SpringIOC之依赖自动注入六层筛选源码剖析 3、SpringAOP之核心底层原理深入剖析 4、SpringAOP之事务核心底层原理深度剖析 5、Spring容器之BeanFactory架构设计剖析 …

JQuery系列(4) - AJAX方法

jQuery对象上面还定义了Ajax方法&#xff08;$.ajax()&#xff09;&#xff0c;用来处理Ajax操作。调用该方法后&#xff0c;浏览器就会向服务器发出一个HTTP请求。 $.ajax方法 $.ajax()的用法主要有两种。 $.ajax(url[, options]) $.ajax([options]) 上面代码中的url&#xff…

android自定义渐变色,Android设置背景渐变色

效果如图&#xff0c;本章只谈背景渐变色&#xff0c;仪表盘下一篇文章实现步骤&#xff0c;只需两步&#xff1a;1.在res/drawable中新建一个gradual_color_bg.xml内容如下&#xff1a;android:startColor"#aa000000" 渐变起始色值android:centerColor""…

dos批处理命令详解

一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能&#xff0c;或显示消息。如果没有任何参数&#xff0c;echo 命令将显示当前回显设置。 语法 echo [{on│off}] [message] Sample&#xff1a; echo off / echo hello world 在实际应用中我们会把…

mac安装npm

brew install node npm install 打包 启动项目 npm run dev 1、npm介绍 npm是基于nodejs的包管理器 从npm服务器下载别人编写的第三方包、模块到本地使用 从npm服务器下载安装别人编写的命令行程序到本地使用 将自己写的包、模块或者命令行程序上传到npm服务器、共别人下…

android navigation bar高度,Android获取屏幕真实高度包含NavigationBar(底部虚拟按键)

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;public int getScreentHeight() {int heightPixels;WindowManager w this.getWindowManager();Display d w.getDefaultDisplay();DisplayMetrics metrics new DisplayMetrics();d.getMetrics(metrics);// since…

tarjan求LCA模板

废话不多说&#xff0c;模板拿来。 1 # include <iostream>2 # include <cstdio>3 # include <cstring>4 # include <string>5 # include <cmath>6 # include <vector>7 # include <map>8 # include <queue>9 # include <c…

BXNA在调试显示新闻的JS?

今天发现了BXNA提供的显示BXNA新闻的JS工作不正常&#xff0c;首先是显示的内容并不是最新的东西&#xff0c;其次就是下午竟然发现JS脚本报错了&#xff0c;我想是不是我这边的问题呢&#xff1f;到了BXNA看了看范例程序竟然也报错了&#xff0c;我想只有两个可能&#xff0c;…

mac安装dubbo-admin

访问 https://github.com/apache/dubbo-admin 1&#xff1a;找到dubbo-admin git下载地址 2:git下载项目 3:执行 mvn clean install 执行 zmvn clean package -Dmaven.test.skiptrue 执行 java -jar dubbo-admin-0.3.0-SNAPSHOT.jar mac电脑安装npm 执行 brew install …

android mmi自动安装,Android平台MMI自动化测试工具通信协议.pdf

File name: Android 平台MMI 自动化测试工具通信协议Version: V1.0 Date&#xff1a;2013/03/07Author: Min LiuAndroid 平台MMI 自动化测试工具通信协议1File name: Android 平台MMI 自动化测试工具通信协议Version: V1.0 Date&#xff1a;2013/03/07Author: Min Liu需通信指令…