目录
一、什么是反射?
小编个人理解:就是将Java类中的一切信息映射(创建)成一个对应的类:属性(字段或成员变量)、方法、构造方法、包等。通过创建Class类对象获取或类中的其他类进行操作。
二、反射的基础Class
1.简单理解概念
Java当中的类用来表示具有相同属性的方法和对象的结合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性值。
简单理解:
不同的动物-> Animal
Java中不同的类->Class
2.获取Class对象的三种方法:
1、用对象名.getClass()获取
Animal a1=new Animal(); a1.getClass();
2、用类名.class获取
Animal.class
3.Class类的forName()方法用目标对象名获取
Class.forName(“java.lang.String”);
3.可进行的部分操作
//获取Class类型信息
public static void printClassInfo(Class cls) {
//类名
System.out.println("类(接口)的名称:" + cls.getSimpleName());
System.out.println("完全限定名:" + cls.getName());
System.out.println("类(接口的类型名称):" + cls.getTypeName());
//父类
Class superCls = cls.getSuperclass();
System.out.println("类的父类:" + superCls.toString());
//实现的接口
Class[] interfacesCls = cls.getInterfaces();
System.out.println("当前类实现的接口:");
for(Class icls : interfacesCls) {
System.out.println(icls);
}
//package包
Package pck = cls.getPackage();
if(pck != null) {
System.out.println("类所在包的名称:" + pck.getName());
}
//判断类型
System.out.println("是否为接口:" + cls.isInterface());
System.out.println("是否为数组:" + cls.isArray());
System.out.println("是否为枚举:" + cls.isEnum());
}
三、Constructor类
用来描述类中所定义的构造方法。
- 得到类的所有构造方法
Constructor constructors【】=
Class.forName(“java.lang.String”).getConstructors();
- 得到类中某个具体的构造方法,在getConstructor中传入参数类型所对应的字节码
Constructor constructor=
Class.forName(“java.lang.String”).getConstryctor(String.class)
使用Consyructor类的目的是用来创建相对应类的对象
正常情况: Stirng str=new String(“hello”);
反射情况: Constructor con=String.class.getConstructor(String.class)
String str=(String)con.nwelnstance(“hello”);
Classs.newlnstance()
通过反射方式创建对象的过程
Class-àConstructor-à某个类的对象
只有当要用某个类的无参构造方法创建该类对象时,可以省略创建Constructor类对象的这个过程。
Date d = (Date)Class.forName(“java.util.Date”).newlnstance();
四、Field类
Field类用来表示类中的属性(字段)。
- Class.getFields():得到Class对象的所有字段,返回的是Field数组。
- Class.getField(String name) 返回一个Field对象,反映此Class对象所表示的类或接口的指定公有成员字段。
- Field的对象所代表的某个类的属性,而不是那个类的某个对象的属性。要得到某个对象对应的属性值,需要通过get(Object.obj)方法与某个对象具体关联。
- 对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到。
- 对于私有属性要得到它所关联的对象的值,需要通过Field的setAccessible(boolean boolean)方法设置。
- Field类的getType()方法用来得到字段所属的类型
五、Method类
用来表示类中的方法。
1、通过Class对象的如下方法得到Method对象
Method getMethod(String name,classs<?>…para,eterTypes)
按名称得到特定的public方法(包括从父类或接口继承的方法)
Method[] getMethods()
得到public方法(包括从父类或接口继承的方法)
Method[] getDeclaredMethods()
得到所有方法(不包括继承的方法)
Method getDeclaredMethod(String name,Class<?>…parameterTypes)
按名称得到某个特定的方法(不包括继承的方法)
2、关于方法参数的操作
(1) int getParameterCount ()
获取该Method对象所表示方法的参数数量。
(2) Parameter [] getParameters ()
返回一个Parameter对象数组,表示该 Method 对象所表示方法的所有参数。
(3) Class <?>[] getParamerTypes ()
获取该 Method 对象所表示方法的所有参数类型的数组。
(4) Type [] getGenericParameterTypes ()
获取该Method对象所表示方法的所有参数类型的数组,一般情况下,同 getParameterTypes ()方法的返回值一样,如果存在则该方法会返回泛型的类型。
3、关于修饰符
(1) int getModifiers ()
得到方法前面所定义的修饰符.
返回类、接口、变量、方法等以整数编码的 Java 语言修饰符,访问修饰符编码列表。
Modifier 类一共提供了12中修饰符的编码表示常量
public static final int PUBLIC =0x00000001;
public static final int PRIVATE =0x00000002;
public static final int PROTECTED =0x00000004;
public static final int STATIC =0x00000008;
public static final int FINAL =0x00000010;
public static final int SYNCHRONIZED =0x00000020;
public static final int VOLATILE =0x00000040;
public static final int TRANSIENT =0x00000080;
public static final int NATIVE =0x00000100;
public static final int INTERFACE =0x00000200;
public static final int ABSTRACT =0x00000400;
public static final int STRICT =0x00000800;
java.lang.reflect.Modifier类提供解码类和成员访问修饰符的静态方法和常量,修饰符集合被表示为具有表示不同的修饰符的不同位置的整数。
总结
反射就是将Java类中的一切信息映射(创建)成一个对应的类:属性(字段或成员变量)、方法、构造方法、包等。通过创建Class类对象获取或类中的其他类进行操作。
了解Class对象部分知识及获取Class对象的三种方式。
简单了解Constructor类(构造方法),Field类(属性,字段),Method类(方法)。