美文网首页
Java 反射机制

Java 反射机制

作者: ssddd1200 | 来源:发表于2016-10-05 22:48 被阅读0次

反射(Reflection)是java语言的一个特性,它允程序在运行时来进行自我检查并且对内部的成员进行操作。一个常见的例子是在JavaBean中,一些组件可以通过一个构造器来操作。这个构造器就是用的反射在动态加载的时候来获取的java中类的属性的。

反射相关的包

java.lang.reflect
java.lang.Class(反射的开始)

通过反射了解类

给定一个类或者对象,通过反射机制可以动态的
了解类的属性,方法,构造函数
创建对象
调用方法
改写属性

应用场景

运行时,动态的情况下应对外面传入的类名,对象实例等
只知道类名字符串
通常应用到框架中

反射的开始:类类型 Class Class

java中有一个类很特殊,就是Class类,这个类是有JVM来创建的,所以我们就不用麻烦了。如果我们拿到一个类的类型信息,就可以利用反射获取其各种成员以及方法了。
在没有对象实例的时候,主要有三种办法。

System.out.println("Method 1:"); //通过一个实例来获得
class Class dog=new Dog().getClass(); 
System.out.println(dog.getName()); 

System.out.println("Method 2:"); //通过className来获得 
Class c=Class.forName(className); 

System.out.println("Method 3:"); //通过已知的类获取class 
Class b=Dog.class; 

注意:第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。
现在得到Class就可以创建一个对象的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。

//方法一 :调用类的空构造方法
Object o=dogClazz.newInstance(); 
System.out.println("创建的对象是:");
System.out.println(o); 
//方法二 :使用有参数的构造方法:Constructor类,这个类用来封装反射得到的构造器
Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
Object o2=c.newInstance("大黄",5);
获取类的成员变量

成员变量用Field类进行封装,主要的方法非常的类似:
public [Field] getDeclaredField([String]) 获取任意指定名字的成员
public [Field][] getDeclaredFields() 获取所有的成员变量
public [Field] getField([String] name) 获取任意public成员变量
public [Field][] getFields() 获取所有的public成员变量

注意,以上的四个方法全部需要抛出异常,当我们获得私有的方法的时候,要用setAccessible设置一下可访问的权限。

Object o = dogClazz.newInstance();
System.out.println("通过空的构造函数创建的对象是"+ o);
Field[] fields=dogClazz.getFields();
for(Field f:fields){
      System.out.println(f.getName());          
}
Field f = dogClazz.getField("name");
f.set(o, "hisdog");
f.get(o);

获取类的方法

封装类的方法的类是Method.获取method也有四个方法
public [Method][] getMethods() 获取所有的共有方法的集合
**public [Method] getMethod([String] name,[Class]<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合 **
public [Method][] getDeclaredMethods() 获取所有的方法
public [Method] getDeclaredMethod([String] name,[Class]<?>... parameterTypes) 获取任意指定方法

Object o = dogClazz.newInstance();
System.out.println("通过空的构造函数创建的对象是"+ o);
Method m=dogClazz.getMethod("bark", new Class[]{});
m.invoke(o, new Object[]{});

注意:在获取类和成员变量时若含有Declared的方法,是获得自定义的目标

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

      本文标题:Java 反射机制

      本文链接:https://www.haomeiwen.com/subject/gbxeyttx.html