Java 反射机制

反射(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的方法,是获得自定义的目标

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容