1 什么是java反射
1.1 什么是反射
- 反射是程序在运行的过程中检测、修改、访问自身状态和行为的能力
1.2 什么是java反射
- java的反射指的是程序在运行时,任意的一个类都能获取到属性和方法,任意一个对象都能调用方法和属性,这种动态的获取信息和动态调用方法的功能称之为java的反射机制
- 一个类只能获取一个字节码对象
如图
1.3反射的作用
- 在运行时判断任意一个对象所属的类;
- 在运行构造任意一个类的对象;
- 在运行时判断任何一个类所具有的方法和属性;
- 在运行时调用任何一个对象的方法;
2 java反射的分类
- 要想结果解剖一个类,必须先获取该类的字节码文件(.class)的对象,使用class类的方法进行解剖;
- class类
- field类
- method类
- construor类
- annoation类
2.1 class类
2.1.1 获取class类的对象的三种方法
- 对象点上getclass (public final native Class<?> getClass())
- 类名点上class()
- Class.forName(“完整的类名加上包名”)(public static Class forName(String className) throws ClassNotFoundException)
实例
package reflect;
public class Reflect {
public static void main(String[] args) throws ClassNotFoundException {
Class<Student> studentClass = Student.class;
System.out.println(studentClass);
Student student=new Student();
Class aClass = student.getClass();
System.out.println(aClass);
Class aClass1 = Class.forName("reflect.Student");
System.out.println(aClass1);
}
}
Student类
package reflect;
public class Student extends StudentSleepPlace implements Goal{
public String name;
public char sex;
public int age;
private Integer StudentID;
Student(){};
Student(String name,int age,char sex){
this.name=name;
this.age=age;
this.sex=sex;
}
public int getStudentID() {
return StudentID;
}
public void setStudentID(Integer studentID) {
StudentID = studentID;
}
public void study(){
System.out.println("我在高一六班学习");
}
@Override
public void getGoal() {
System.out.println("目标考大学");
}
}
StudentSleepPlace类
package reflect;
public class StudentSleepPlace {
public void placeOne(){
System.out.println("宿舍睡觉");
}
public void placeTwo(){
System.out.println("回家睡觉");
}
public void placeThree(){
System.out.println("租房子睡觉");
}
}
goal接口
package reflect;
public interface Goal {
void getGoal();
}
2.1.2 class类的常用方法
方法 | 描述 |
---|
public String getName() | 获取完整的包名(包名+类名) |
public String getSimpleName() | 获取类名 |
public Field[] getFields() | 获取被public修饰的Field的列表 |
public Field[] getDeclareFields() | 获取被public修饰的Field的列表 |
public Field[] getDeclareField(String name) | 根据属性名获取Field |
public Method[] getDeclareMethods() | 获取类中的所有方法,但是不包括父类的方法 |
public Method getDeclareMethod(String name ,类<?>… parameterTypes,) | 根据方法名和方法形参获取一个指定方法 |
public Constructor[] getDeclareConstructors() | 获取类中的所有的构造方法 |
public Constructor etDeclareConstructor(String name ,类<?>… parameterTypes,) | 根据构造方法名和构造方法形参获取一个指定方法 |
public class<? super T> getSuperClass() | 获取父类的class对象 |
public class<? >[] getInterface() | 获取实现接口的集合 |
public native int getmodifiers | 获取该类的的修饰符 |
public T newInstance() | 获取该类的对象 |
2.1.3 示例
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InstantiationException {
Class<Student> studentClass = Student.class;
String name = studentClass.getName();
System.out.println(name);
System.out.println("==========================");
String simpleName = studentClass.getSimpleName();
System.out.println(simpleName);
System.out.println("==========================");
Field[] fields = studentClass.getFields();
for (int i = 0; i <fields.length ; i++) {
System.out.println(fields[i]);
}
System.out.println("==========================");
Field[] declaredFields = studentClass.getDeclaredFields();
for (int i = 0; i <declaredFields.length ; i++) {
System.out.println(declaredFields[i]);
}
System.out.println("==========================");
Field name1 = studentClass.getDeclaredField("name");
System.out.println(name1);
System.out.println("==========================");
Method[] declaredMethods = studentClass.getDeclaredMethods();
for (int i = 0; i <declaredMethods.length ; i++) {
System.out.println(declaredMethods[i]);
}
System.out.println("==========================");
Method setStudentID = studentClass.getDeclaredMethod("setStudentID", Integer.class);
System.out.println(setStudentID);
System.out.println("==========================");
Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
for (int i = 0; i <declaredConstructors.length; i++) {
System.out.println(declaredConstructors[i]);
}
System.out.println("==========================");
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class, char.class);
System.out.println(declaredConstructor);
System.out.println("==========================");
Class<? super Student> superclass = studentClass.getSuperclass();
System.out.println(superclass);
System.out.println("==========================");
Class<?>[] interfaces = studentClass.getInterfaces();
System.out.println(interfaces.toString());
System.out.println("==========================");
int modifiers = studentClass.getModifiers();
System.out.println(modifiers);
System.out.println("==========================");
Student student = studentClass.newInstance();
int age = student.age;
System.out.println(age);
}
}
2.2 Field类
2.2.1 Field类的常用方法
方法 | 描述 |
---|
public String getName() | 获取属性的方法名 |
public int getmodifiers() | 获取属性修饰符,返回的是一个数字,一般配置modify类的toString(int a)方法使用 |
public class<?> getType() | 获取属性的类型 |
public void set(Object obj,value) | 为属性赋值 |
public object get(Object obj) | 获取属性的值 |
public void setAccessible(boolean flag) | true打破封装 |
2.2.2 示例
package reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Reflect {
public static void main(String[] args) throws Exception {
Class<Student> studentClass = Student.class;
Field[] Allfields = studentClass.getDeclaredFields();
for(Field field:Allfields){
System.out.println(Modifier.toString(field.getModifiers())+" "+field.getName());
}
Field name = studentClass.getDeclaredField("name");
Student student = studentClass.newInstance();
name.set(student,"小王");
Object o = name.get(student);
System.out.println(o);
Field studentID = studentClass.getDeclaredField("StudentID");
studentID.setAccessible(true);
studentID.set(student,12);
Object o1 = studentID.get(student);
System.out.println(o1);
}
}
2.3 Method 方法
2.3.1 Method常用方法
方法 | 描述 |
---|
public String getName() | 获取属性的方法名 |
public int getmodifiers() | 获取方法修饰符,返回的是一个数字,一般配置modify类的toString(int a)方法使用 |
public class<?> getReturnType() | 获取方法的返回类型 |
public class<?> getParameterType() | 获取方法的形式参数类型 |
public void invoke(Object obj,patameters…type) | 调用方法 |
2.3.2 示例
package reflect;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
public class Reflect {
public static void main(String[] args) throws Exception {
Class<?> Student = Class.forName("reflect.Student");
Method[] allMethods = Student.getDeclaredMethods();
for (int i = 0; i <allMethods.length ; i++) {
ArrayList arrayList=new ArrayList();
Class<?>[] parameterTypes = allMethods[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
arrayList.add(parameterTypes[j].getSimpleName());
}
System.out.println(Modifier.toString(allMethods[i].getModifiers())+" "+allMethods[i].getReturnType()+" "+allMethods[i].getName()+"(" +arrayList.toString()+")");
}
System.out.println("===========================");
Method setStudentID = Student.getDeclaredMethod("setStudentID", Integer.class);
Student o = (Student) Student.newInstance();
setStudentID.invoke(o,12);
System.out.println(o.getStudentID());
}
}
2.4 Constructor类
2.4.1 Constructor常用方法
方法 | 描述 |
---|
public String getName() | 获取属性的方法名 |
public int getmodifiers() | 获取构造方法修饰符,返回的是一个数字,一般配置modify类的toString(int a)方法使用 |
public class<?> getParameterType() | 获取方法的形式参数类型 |
public T invoke(patameters…type) | 创建一个对象 |
2.4.2 示例
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
public class Reflect {
public static void main(String[] args) throws Exception {
Class<?> Student = Class.forName("reflect.Student");
Constructor<?>[] allConstructors = Student.getDeclaredConstructors();
for (Constructor constructor:allConstructors){
ArrayList arrayList=new ArrayList();
Class[] parameterTypes = constructor.getParameterTypes();
for (Class<?> classType:parameterTypes){
arrayList.add(classType.getSimpleName());
}
System.out.println(Modifier.toString(constructor.getModifiers())+" "+constructor.getName()+"("+arrayList.toString()+")");
}
Constructor<?> declaredConstructor = Student.getDeclaredConstructor(String.class, int.class, char.class);
Student students = (Student)declaredConstructor.newInstance("张三", 12, '男');
System.out.println(students.sex);
System.out.println(students.name);
System.out.println(students.age);
}
}