JAVA反射机制

什么是反射:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
条件:
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,
用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、
或唤起其methods。(百度百科)
尽管java不是动态语言 但是java提供了一个非常重要的API用于完成反射的需求。Reflection
学习:
要学习反射,先来介绍下需要学习或者理解的类(直接抄的API的解释词语) 其实能熟练读懂api比看一些教程有用的多
1、java.lang.Class<T>//Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
2、java.lang.reflect(包)
  java.lang.reflect.Constructor<T> //提供关于类的单个构造方法的信息以及对它的访问权限。
  java.lang.reflect.Field //Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
  java.lang.reflect.Method //Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
  java.lang.reflect.Modifier  //Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
  例子:
  获取包名,类名.......
    

public static void main(String[] args) {String strObj= new String();//创建对象,这种方式创建,比较容易理解创建了一个String对象Class classObj = strObj.getClass();//获取了一个运行中的实例模型  有兴趣的可以去读一下源码,就不往外贴了System.out.println(classObj.getName());//完整类名     System.out.println(classObj.getPackage().getName());//包名
//Result java.lang.String  java.lang

 }

  实例化Class对象的方式:通常理解实例化一个类的Class模型,比如我使用的String这个类,就是实例化了一个String的Class的模型对象

    public static void main(String[] args) throws Exception {Class<?> classObj = null;classObj = Class.forName("java.lang.String");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)
        System.out.println(classObj.getName());classObj=new String().getClass();System.out.println(classObj.getName());classObj=String.class;System.out.println(classObj.getName());//Result  java.lang.String  java.lang.String  java.lang.String}

  获取父类和接口

    public static void main(String[] args) throws Exception {Class<?> classObj = null;classObj = Class.forName("java.lang.String");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)System.out.println(classObj.getSuperclass().getName());//父类名Class[] classList=classObj.getInterfaces();//接口列表for (Class obj: classList) {System.out.println(obj.getName());//实现的接口}//Result  java.lang.Object  默认所有的类都是继承Object类// java.io.Serializable // java.lang.Comparable // java.lang.CharSequence}


上方这些在Class的API都有详细介绍
通过反射实例化一个类的对象:两种方式使用类的默认构造方法,指定一个构造方法
public class Test {public static void main(String[] args) throws Exception {//----------------------------------//第一种Class<?> classObj = null;classObj = Class.forName("com.jctl.cloud.test.Student");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)Student student = (Student) classObj.newInstance();student.setName("明");System.out.println(student.toString());//第二种Constructor<?> cons[] = classObj.getConstructors();//获取所有的构造方法for (Constructor constructor: cons) {Class<?> [] params=  constructor.getParameterTypes();for (Class param : params) {System.out.println(param.getName());}System.out.println("****************************");//打印几次说明有几个构造方法啊}Student student1 = (Student) cons[1].newInstance("marry",10);System.out.println(student1.toString());}}
class Student{private String name;private Integer age;public Student() {}public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

控制台:

  //Result    Student{name='明', age=null}  ****************************  java.lang.String  java.lang.Integer  ****************************  Student{name='marry', age=10}
获取类的全部属性
 public static void main(String[] args) throws Exception {//----------------------------------//第一种Class<?> classObj = null;classObj = Class.forName("com.jctl.cloud.test.Student");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)Field[]  fields=  classObj.getDeclaredFields();for (Field field: fields) {//修饰符  + 类型  + 名字System.out.println(Modifier.toString(field.getModifiers()) +"  "+field.getType().getSimpleName()+"    "+field.getName());}}

//console  

修改类的属性无视private
public static void main(String[] args) throws Exception {//----------------------------------//第一种Class<?> classObj = null;classObj = Class.forName("com.jctl.cloud.test.Student");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)
Object object=classObj.newInstance();Field field = classObj.getDeclaredField("name");// 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。field.setAccessible(true);field.set(object, "xiaomei");System.out.println(field.get(object));// field.get(Object obj) 反回指定对象上此 Field 表示的字段的值。}//console   

获取类的全部方法

  先给上面的Student类增加一个方法

 public void doHomeWork(){System.out.println(this.name+"开始写作业了!");}
public void doHomeWork() {    System.out.println("开始写作业了!");}
 

public static void main(String[] args) throws Exception {//----------------------------------//第一种Class<?> classObj = null;classObj = Class.forName("com.jctl.cloud.test.Student");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)Method[] methods = classObj.getDeclaredMethods();for (Method method : methods) {System.out.println( Modifier.toString(method.getModifiers())+"  "//修饰符+method.getGenericReturnType().toString()+"  "+//返回值 method.getName());//方法名
        }//public  class java.lang.String  toString//  public  class java.lang.String  getName//public  void  setName// public  class java.lang.Integer  getAge// public  void  setAge//public  void  doHomeWork
}

  直接调用类的方法:

    public static void main(String[] args) throws Exception {Class<?> classObj = null;classObj = Class.forName("com.jctl.cloud.test.Student");//返回与带有给定字符串名的类或接口相关联的 Class 对象。(API)Method methods = classObj.getMethod("doHomeWork");methods.invoke(classObj.newInstance());//控制台   null开始写作业了!
Method methods1 = classObj.getMethod("doHomeWork",String.class);methods1.invoke(classObj.newInstance(),"\"小明\"");     //控制台 小明开始写作业了!}

 写了这些反射在java中怎么使用和基本用法,总得做点什么,下一篇反射在代理模式中的应用----------->>>

  

转载于:https://www.cnblogs.com/lewskay/p/7216968.html

java反射 一些理解相关推荐

  1. Java 反射的理解

    2019独角兽企业重金招聘Python工程师标准>>> 先来说说一些基本的概念: class:一个类有多个对象(实例).在内存中类只有一份,而实例有多份.(这对于Java锁的运行是十 ...

  2. 对于java反射的理解

    java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无序在组件之间进行链接. 反射允许在编写与执行时,使程序代码能够接入装载到JVM的类的内部信息,而不是源代码中选定的类 ...

  3. 通过Java反射来理解泛型的本质

    集合框架中经常会使用泛型指定集合中所存放元素的类型,保证集合的统一性,从集合中取出元素的时候也避免了类型强制转换的操作,所以我们使用常规的方式来往集合中存放元素的时候,如果指定泛型,那么我们只能向集合 ...

  4. java 反射解读理解

    package import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;import j ...

  5. Java反射理解与案例

    2019独角兽企业重金招聘Python工程师标准>>> https://my.oschina.net/zc741520/blog/195460 Java 反射简单理解就是通过类名或者 ...

  6. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  7. 12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

    文章目录 Java反射机制 理解Class类 获取Class类实例 类的加载过程 类加载器ClassLoader 创建运行时类的对象 获取运行时类的结构 调用运行时类的指定结构 动态代理 Java反射 ...

  8. 如何理解java反射_怎么理解java反射

    怎么理解java反射? 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个"反着来"的过程.我们通过new创建一 ...

  9. 深入理解Java反射+动态代理,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起在群里探讨技术. 答: ...

最新文章

  1. Python 列表和迭代器区别
  2. Syn Bot /OSCOVA 快速回复(11)
  3. 图片的多义现象和相互作用
  4. spark standalone集群安装及spark on yarn
  5. 2018-10-19 Chrome插件实现GitHub代码离线翻译v0.0.4
  6. r720支持多少频率的内存吗_电脑基础知识:内存条知识大全,看完小学生都了解...
  7. 互联网人求职现状:逃离互联网的人增多 求稳可以牺牲涨薪
  8. IntelliJ Idea学习笔记008---Idea左侧栏不显示目录结构_或者只显示一个Project不显示其他东西
  9. DCOM 遇到错误“登录失败: 未知的用户名或错误密码
  10. python学习笔记--Django入门二 Django 的模板系统
  11. php仿u8系统模板_用友U8:项目型制造企业的信息化模板
  12. 深入学习理解UNIX网络编程
  13. Jade linux 位置,jade 6.5 安装教程
  14. ajax401错误,使用jqueryajax捕获401未经授权的http响应
  15. 跃迁-功利心的学习方法,学的更好,学的更少
  16. Java 编程问题:四、类型推断
  17. appstore上传截图的各种尺寸
  18. 《C语言入门》猜数字小游戏代码实现
  19. 【吴恩达深度学习】05_week2_quiz Natural Language Processing Word Embeddings
  20. windows重装系统之后,开机显示“An operating system wasn't found,Try disconnecting any drives that...”(亲身遇到+解决方法)

热门文章

  1. DB2数据库指定时间点恢复案例
  2. XML文档搜索使用小结
  3. 在Word 2007中为公式编号
  4. C#中的delegate和event (转)
  5. 数据结构与算法-学习笔记(18)
  6. nginx源码分析:打开监听套接字的流程
  7. 区块链技术:颠覆性革命浪潮的开始
  8. Android+Jquery Mobile学习系列(3)-创建Android项目
  9. python连接mysql的操作
  10. CentOS 7.2下编译安装PHP 7