反射机制
反射机制如果只是针对于普通开发者而言,意义不大,一般都是作为一些系统的架构设计去使用的,包括开源框架,几乎都反射机制。
认识反射
反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
package com.neuedu.csdnTest;
class Person{
}
public class Test {
public static void main(String[] args) {
Person person = new Person();//正着操作
System.out.println(person.getClass().getName());//反着来
}
}
以上的代码使用了一个getClass()方法,而后就可以得到 对象所在的“包类”名称,这就属于“反”了,但是在这个“反”的操作之中有一个getClass()就作为发起一切反射操作的开端。
Person的父类是Object类,而上面所使用的getClass()方法就是Object类之中所定义的方法
取得Class对象:public final Class<?> getClass(),反射之中所有的泛型都定义为?,返回值都是Object。
而这个getClass()方法返回的对象是Class类的对象,所以这个Class就是所有反射操作的源头。既然Class是所有反射操作的源头,那么这个类肯定是最为重要的,取得这个类的实例化对象,Java定义了三种方式:
方式一:通过Object类的getClass()方法取得,基本不用
方式二:使用“类.class”取得
package com.neuedu.csdnTest;
class Person{
}
public class Test {
public static void main(String[] args) {
Class<?> cls = Person.class;//取得class对象
System.out.println(cls.getName());//反着来
}
}
方式三:使用Class类内部定义的一个static方法,主要使用
1 class对象
Class:表示政治运行的Java应用程序中的类和接口,能够获取类的相关的信息(类的属性、方法、父类、接口..)
是在Java语言中定义一个特定类的实现,用于表示当前运行的Java应用程序中的类和接口,包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类
2 获取类的Class对象的3方式
类名.class
类的实例.getClass()方法
Class.forName()方法
3 class对象 常用方法
getAnnotations() 获取类的注解
getConstructors() 获取构造方法
getDeclaredFields() 获取所有的属性
getDeclaredMethod 获取所有的方法
getField 获取一个属性对象
getInterfaces() 获取所有的接口
getName() 获取名字
4 class对象获取方法、通过反射调用方法
getDeclaredMethods() 获取类本身所有的方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
getMethods() 获取类本身及父类及接口所有的公有的方法
getMethod(
String name,
Class<?>...parameterTypes)
根据名字获取某个公有的方法对象,name方法的名 字, parameterTypes参数的类型
getDeclaredMethod(
String name,
Class<?>...parameterTypes)
获取到本身类的一个方法
Method对象的invoke(
Object obj,
Object... args)方法:
执行改方法,参数obj表示方法必须在那个实例对象里面执行 参数args表示方法的参数的值
5 class对象获取属性、通过反射设置属性的值
getFields() 获取所有的public字段(包括继承的)
getDeclaredFields
()
获取本身类所有的属性字段,包括私有的
getField(
String name)
根据名字获取某个public字段对象
getDeclaredField(
String name)
根据名字获取本身类的字段(可以获取private)
6 class对象创建类的对象、通过反射调用构造方法
newInstance()
创建一个对象(调用默认的无参数的构造方法)
getConstructors()
获取所有的构造方法对象