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