一、介绍:
1、反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
2、四维导图:
?
二、获取class类:
1、前提:Class本身也是一个类;Class对象只能由系统建立对象;一个加载的类在JVM中只会有一个Class实例;一个Class对象对应的是一个加载到JVM中的一个.class文件;每个类的实例都会记得自己是由哪个Class实例所生成;通过Class可以完整地得到一个类中的所有被加载的结构;Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。
2、反射获取Class类的几种方法:
(1)若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高
Class class = User.class;
(2)已知某个类的实例,调用该实例的getClass()方法获取Class对象
Class class = user.getClass();
(3)已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
Class class = Class.forName("reflect.User")
(4)内置基本数据类型可以直接用类名.Type
(5)还可以利用ClassLoader。
3、哪些类型可以有class对象:
二、获取类运行时的结构:通过反射获得运行时类的完整结构,包括Field,Method(方法),Constructor(构造器),Superclass(父类),Interface,Annotation(注解)。
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//获取类的信息
public class Test07 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("reflect.User");
// User user = new User();
// Class c1 = user.getClass();
//获取类的名字
System.out.println("获取类的名字-----------------------------------------------------");
System.out.println(c1.getName());//获取包名+类名
System.out.println(c1.getSimpleName());//获取类名
//获取类的属性
System.out.println("获取类的属性-----------------------------------------------------");
Field[] fields = c1.getFields();//只能找到public属性
fields = c1.getDeclaredFields();//找到全部的属性
for (Field field : fields) {
System.out.println(field);
}
//获得指定属性的值
Field name = c1.getDeclaredField("name");
System.out.println(name);
//获得类的方法
System.out.println("获取类的方法-----------------------------------------------------");
Method[] methods = c1.getMethods();
for (Method method : methods) {
System.out.println("公共的:"+method);//获得本类及其父类所有的public方法
}
methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println("全部的:"+method);//获得本类全部方法
}
//获得指定方法
Method getName = c1.getMethod("getName",null);
Method setName = c1.getMethod("setName", String.class);
System.out.println(getName);
System.out.println(setName);
//获得类的构造器
System.out.println("获取类的构造器-----------------------------------------------------");
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println("##"+constructor);
}
//获得类的指定构造器
Constructor DeclaredConstructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
System.out.println("指定的:"+DeclaredConstructor);
}
}