目录
话不多说,直接上车! 发车!!!
什么是反射?
反射是Java独有的技术,是Java技术显著的特点。
反射是指对于任何一个类,在运行的时候都可以直接得到这个类全部成分。
反射有什么作用?
在运行时,可以直接得到这个类的构造器对象。
在运行时,可以直接得到这个类的成员变量对象。
在运行时,可以直接得到这个类的成员方法对象。
在反射中,所获得的都是对象!!!
反射的缺点?
反射的使用?
获取类对象
Student类
package com.reflect;
public class Student {
}
获取类对象的三种方式
package com.reflect;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//类名.class
Class studentClass = Student.class;
//对象.class
Student student = new Student();
Class aClass = student.getClass();
//class.forName(全限名)
Class aClass1 = Class.forName("com.reflect.Student");
}
}
获取构造器对象并创建对象
Student类
package com.reflect;
public class Student {
private String name;
private int age;
private Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
获取构造器的四种方式
package com.reflect;
import java.lang.reflect.Constructor;
public class ReflectDemo2 {
public static void main(String[] args) throws NoSuchMethodException {
getDeclaredConstructor();
}
public void getConstructors(){
Class<Student> studentClass = Student.class;
//只能获取public修饰的构造器
Constructor<?>[] constructors = studentClass.getConstructors();
}
public void getDeclaredConstructors() throws NoSuchMethodException {
Class<Student> studentClass = Student.class;
//获取全部构造器,不论权限是什么
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
}
public void getConstructor() throws NoSuchMethodException {
Class<Student> studentClass = Student.class;
//根据参数获取构造器,只能获取public修饰的
Constructor<Student> constructor = studentClass.getConstructor(String.class,int.class);
}
public static void getDeclaredConstructor() throws NoSuchMethodException {
Class<Student> studentClass = Student.class;
//根据参数获取构造器,不论权限是什么
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
System.out.println(declaredConstructor.getName());
}
}
获取构造器并创建实例
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectDemo3 {
public static void main(String[] args) {
}
//调用无参构造器得到一个类的对象
public static void createObj1() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取类对象
Class<Student> studentClass = Student.class;
//获取无参构造器
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
//暴力反射,攻破权限
declaredConstructor.setAccessible(true);
//创建实例
Student s1 = declaredConstructor.newInstance();
}
//调用有参构造器得到一个类的对象
public static void createObj2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取类对象
Class<Student> studentClass = Student.class;
//获取有参构造器
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class);
//创建实例
Student student = declaredConstructor.newInstance("孙悟空",1000);
}
}
获取成员变量并赋值
Dog类
package com.reflect;
public class Dog {
private String name;
private int age;
private String color;
public static String school;
public static final String SCHOOL_1 = "宠物学校";
public Dog(){
}
public void run(){
System.out.println("狗跑的贼快~~~");
}
private void eat(){
System.out.println("狗吃骨头~~~~");
}
private void eat(String name){
System.out.println("狗吃"+name);
}
public Dog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public static String getSchool() {
return school;
}
public static void setSchool(String school) {
Dog.school = school;
}
public static String getSchool1() {
return SCHOOL_1;
}
}
获取成员变量并赋值
public static void getDeclareFields(){
Class<Dog> dogClass = Dog.class;
//获取全部声明的成员变量,不论权限是什么
Field[] fields = dogClass.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
}
public static void getDeclareField() throws NoSuchFieldException {
Class<Dog> dogClass = Dog.class;
//获取某个成员变量,根据名字
Field age = dogClass.getField("age");
System.out.println(age.getName());
}
public static void setField() throws NoSuchFieldException, IllegalAccessException {
Class<Dog> dogClass = Dog.class;
//获取某个成员变量,根据名字
Field age = dogClass.getField("age");
//因为age是私有的,需要暴力攻破权限
age.setAccessible(true);
Dog dog = new Dog();
age.set(dog,"狗");
}
获取成员方法并调用
//获取所有声明的方法
public static void getDeclaredMethods(){
Class<Dog> dogClass = Dog.class;
Method[] declaredMethods = dogClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
}
// 根据方法名和参数类型获取方法,不关心权限是什么
public static void getDeclaredMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<Dog> dogClass = Dog.class;
Method declaredMethod = dogClass.getDeclaredMethod("run");
System.out.println(declaredMethod.getName());
Dog dog = new Dog();
//用获取的方法对象调用run方法
declaredMethod.invoke(dog);
}