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,一经查实,立即删除!

相关文章

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

从上周六开始到今天早上&#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…

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

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

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""…

mac安装npm

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

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…

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 …

Mac下使用终端查看某个端口号对应的进程和杀死进程

查看端口号对应的进程 打开终端&#xff0c;输入lsof -i tcp:port&#xff0c;port即为端口号&#xff0c;如8080 如回车之后结果如图&#xff1a; 使用kill -9 PID

创建基于AJAX技术的Scribble应用程序

简介ASP.NET Atlas是一套丰富的类库&#xff0c;用于ASP.NET开发AJAX风格的应用程序。本文试图解说Atlas框架的一般性特征&#xff0c;由于Atlas是一个庞大的库&#xff0c;故本文集中探讨Atlas的两个最重要的特征&#xff1a;1. 能够从客户端脚本中调用服务器端web服务2. 使得…

android resolvesize方法,Android 自定义View中onMeasure()中使用resolveSize()是什么意思?

缥缈止盈public static int resolveSize(int size, int measureSpec) { int result size; int specMode MeasureSpec.getMode(measureSpec); int specSize MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSp…

mac版idea插件安装位置

cd /Users/xxxx/Library/ApplicationSupport/JetBrains xxx 替换为自己的用户名 ls cd IntelliJIdea2020.1 cd plugins

android listview 最大行数,android中的ListView数据量大时如何提高效率。。。。

数据量大&#xff0c;这牵涉到2个问题。1. 一个空ListView加载的数据项很多2. 已加载很多数据项的ListView如何优化效率对于问题1&#xff1a;一个空ListView加载的数据项很多一般就是动态加载&#xff0c;仅在需要加载的时候加载数据项。比如View只能显示10项&#xff0c;当滚…

從三種方式看SQL的使用程度

以下三種方式﹐實現的是同一功能﹐也是我同一天中實現 的三種方式。記載在這里不為別的﹐只為對自己一點SQL的小小總結吧。 UpdateTEMP_PP_SH_MFG_SCH SetMFG_SCH_JOBNO Left(MFG_SCH_JOBNO,6)CASELEN(RIGHT(MFG_SCH_JOBNO,4)ID) WHEN1THE…

android手机用多久会卡机,你知道Android手机用久了会卡,而iPhone则不会是为什么吗?...

原标题&#xff1a;你知道Android手机用久了会卡&#xff0c;而iPhone则不会是为什么吗&#xff1f;如果有人问为什么iPhone能成为手机行业当之无愧的领头羊&#xff1f;为什么那么多人抢着入手iPhone X&#xff1f;为什么黄牛只会炒iPhone手机。我想大多数人的回答就是&#x…

BaaS后端即服务 - 概念篇

摘要&#xff1a; 什么是BaaS&#xff1f; BaaS&#xff08;Backend as a Service&#xff09;是一种新型的云服务&#xff0c;旨在为移动和Web应用提供后端云服务&#xff0c;包括云端数据/文件存储、账户管理、消息推送、社交媒体整合等。BaaS是垂直领域的云服务&#xff0c;…

使用maven构建的Spring boot项目在开始搭建的时候出的一些错误

首先&#xff0c;先构建一个maven项目&#xff0c;构建好了之后&#xff0c;会有一个错误,先说明一下&#xff0c;我生成maven项目时jre给我自动选择的是1.5版本的&#xff0c;而本人安装的是1.8的 然后&#xff0c;我们要消除这个错误&#xff0c;发现是缺少了一个javax.servl…