反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
获取Class
// 使用类的class属性来获取该类对应class对象
// 调用对象的getClass()方法,返回该对象所属类对应的class对象
// 使用class类中的静态方法forName(String className)
package com.itheima_01;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 使用类的class属性来获取该类对应class对象
Class<Student> c1=Student.class;
System.out.println(c1);
Class<Student> c2=Student.class;
System.out.println(c1=c2);
System.out.println("-------------");
// 调用对象的getClass()方法,返回该对象所属类对应的class对象
Student s=new Student();
Class<?extends Student> c3=s.getClass();
System.out.println(c1==c3);
System.out.println("-------------");
// 使用class类中的静态方法forName(String className)
Class<?> c4=Class.forName("com.itheima_01.Student");
System.out.println(c1==c4);
}
}
package com.itheima_03;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/*
反射获取成员变量并使用
* */
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 获取Class对象
Class<?> c=Class.forName("com.itheima_01.Student");
// Filed[] getFields()返回一个包含Field对象的数组,Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段
// Filed[] getDeclaredFields()返回一个包含Field对象的数组,反映了由该Class对象表示的类或接口声明所有字段
// Field[] fields = c.getFields();
Field[] fields=c.getDeclaredFields();
for (Field f:fields)
{
System.out.println(f);
}
System.out.println("——————————————获取单个成员变量————————---");
// Field getField(String name)返回一个Field对象,该对象反映由该Class对象表示的类或者接口的指定公共成员字段
Field addressField=c.getField("address");
System.out.println(addressField);
// Filed[] getField()返回单个公共成员变量对象
// Filed[] getDeclaredField()返回单个成员变量对象
// 获取无参构造方法创建对象
Constructor<?> con=c.getConstructor();
Object obj=con.newInstance();
//
addressField.set(obj,"西安");//给obj的成员变量addressField赋值为西安
System.out.println(obj);
}
}
package com.itheima_03;
import com.itheima_01.Student;
import javax.xml.namespace.QName;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/*
Student s=new Student();
s.name="林青霞";
s.age=30;
s.address="西安";
System.out.println(s);
*/
public class ReflectDemo02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Class<?> c=Class.forName("com.itheima_01.Student");
// Student s=new Student();
Constructor<?> con=c.getConstructor();
Object obj=con.newInstance();
System.out.println(obj);
/*// 将所有的成员变量去不获取
Field[] fields=c.getDeclaredFields();
for (Field f:fields)
{
}*/
// s.name="林青霞";
// NoSuchFieldException: name因为是私有的
// Field nameField=c.getField("name");//拿到的是公共的成员变量
Field nameField=c.getDeclaredField("name");//IllegalAccessException
// 需要取消访问检查
nameField.setAccessible(true);//取消对私有成员变量的检查
nameField.set(obj,"林青霞");
System.out.println(obj);
Field ageField=c.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(obj,30);
System.out.println(obj);
Field addressField=c.getDeclaredField("address");
addressField.setAccessible(true);
addressField.set(obj,"西安");
System.out.println(obj);
}
}