反射
定义:反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性
项目开发中常见的使用反射的场景:
1、使用JDBC连接数据库
2、Servlet在Web容器中的加载和运行
反射的作用:
- 在运行时获取类的修饰符,包名,类名,实现的接口,继承的父类
- 在运行时获取类的所有属性名,修饰符,属性类型
- 在运行时获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
- 在运行时调用加载类的方法
反射的使用
获取Class对象的三种方式:
- Object ——> getClass();==>知道对象名
- 任何数据类型(包括基本数据类型)都有一个“静态”的class属性==>知道类名
- 通过Class类的静态方法:forName(String className)(常用)==>知道类的完全限定名
注:在运行期间,一个类只有一个Class对象产生
第一种已有对象,无需反射
第二种需要导入类的包,依赖太强
第三种中一个字符串可以传入,也可写在配置文件中
java反射API
使用反射机制的三个步骤:
1.获取类对象
如:Class<Student> stu=Student.class;
2.通过类对象获取构造方法
如:Constructor<Student> con=stu.getDeclaredConstructor();
3.通过构造方法创建对象
如:Student student=con.newInstance();
常用类:
1、java.lang.Class
如:
public static Student getStudent(){
Class<Student> s=Student.class;
Student stu=null;
try {
Constructor<Student> c=s.getDeclaredConstructor();
c.setAccessible(true);
stu=c.newInstance();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return stu;
}
2、java.lang.reflect.Method
如:
public class TestMethod {
public static void main(String[] args) throws Exception{
Student s=TestStudent.getStudent();
Class<Student> c=Student.class;
Method setstuId = c.getDeclaredMethod("setStuId", int.class);
setstuId.setAccessible(true);
setstuId.invoke(s,3);
Method getStuId=c.getDeclaredMethod("getStuId");
getStuId.setAccessible(true);
Object stuId = getStuId.invoke(s);
System.out.println(s);
System.out.println(stuId);
}
}
3、java.lang.Constructor
如:
public class TestConsturctor {
public static void main(String[] args) throws Exception {
Class<Student> c=Student.class;
Constructor<Student> sClass=c.getDeclaredConstructor(int.class,
String.class,String.class);
sClass.setAccessible(true);
Student s=sClass.newInstance(2,"马爸爸","爹");
System.out.println(s);
}
}
4、java.lang.Field
如:
public class TestField {
public static void main(String[] args) throws Exception {
Student s=TestStudent.getStudent();
Class<Student> c=Student.class;
Field stuId = c.getField("stuId");
stuId.set(s,11);
Field stuName=c.getDeclaredField("stuName");
stuName.setAccessible(true);
stuName.set(s,"泡腾片");
Field[] fields=c.getDeclaredFields();
for (Field field:fields) {
field.setAccessible(true);
System.out.println(field.get(s));
}
System.out.println(s);
}
}