反射

本文介绍了Java反射机制,它可动态实例化对象、读写属性、调用方法。一切反射代码从获取类对象开始,有三种获取方式。同时阐述了反射的三大作用,包括实例化对象、动态调用方法和读写属性,并给出了相关操作的方法及注意事项。

什么是反射
类类
反射三大作用

反射的概念

反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

类类

所有类 类类 java.lang.Class 类对象 特定类 特定的行为和属性
列如 所有狗 狗类 Dog.class 狗对象(具体的狗 旺财)

一切反射相关的代码都从获得类对象开始

三种获取类对象的方法:
1 Class.forName(完整类名)
2 类名.class
3 对象.getClass()

注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个

/**
 * 获得类对象的方式
 * 获取java.lang.Class的一个类实例
 * -->对于本堂课而言,Student.class
 * 1、通过对应类(java.lang.Class)实例化的类(Student.class)实例的getClass()方法获取
 *   通用增删改的时候用到
 * 2、通过Class.forName("类的全路径");  JDBC的驱动加载就用反射技术
 * 3、类实例.class
 *   做通用查询的时候用到
 * @author tt
 */
 public class Demo2 {
public static void main(String[] args) throws Exception {
//获取类对象的方法一
// Student stu = new Student();
// Class clz = stu.getClass();
 //获取类对象的方法二
// Class clz = Class.forName("com.zking.reflect.Student");
//获取类对象的方法三
 Class clz = Student.class;
 System.out.println(clz);
 }
 }
 }

反射三大作用(java.lang.reflect.*)

1 实例化对象

Constructor.getConstructor/Constructor.getDeclaredConstructor
注:一定要提供无参构造器

/**
 * 利用反射进行实例化
 *   能够获取到Student.class
 *    如何通过Student.class拿到Student的一个实例化?
 * @author tt
 * 反射的好处?
 * 能够将未知的类进行实例化
 *           ClassNotFoundExecption
 */
 public class Demo3 {
 public static void main(String[] args) throws Exception, Exception {
  Class clz = Student.class;
  //  通过反射的方式调用无参构造器来实例化对象
//  Student stu = (Student)clz.newInstance();
//  通过反射的方式调用带有一个参数的构造器来实例化对象    Class
//   Constructor c = clz.getConstructor(String.class);
//  Student stu = (Student)c.newInstance("s001");
//  通过反射的方式调用带有两个参数的构造器来实例化对象    Class
//   Constructor c = clz.getConstructor(String.class,String.class);//获取构造器对象
//  Student stu = (Student)c.newInstance("s001","zs");
//  通过反射的方式调用私有化构造器来实例化对象    Class
//  getConstructor 与 getDeclaredConstructor的区别
//  getConstructor 获取到是public修饰的
//  getDeclaredConstructor 获取的所有的构造器
   Constructor c = clz.getDeclaredConstructor(Integer.class);
   c.setAccessible(true);
   Student stu = (Student)c.newInstance(21);
   //  Student stu = new Student();
 }
}
/*
 *  <servlet>
 *  <servlet-name></servlet-name>
 * <servlet-class>全路径名com.zking.Aservlet</servlet-class>
 * </servlet>
 * <servlet-mapping>
 *  <servlet-name></servlet-name>
 *  <url-pattern></url-pattern>
  *  </servlet-mapping>
 * 类全路径名.class
 * AServlet.class extends HttpServlet
 * 创建tomcat的开发人员是不清楚未来程序员编码出现什么类(ASerlet.class)
 *  AServlet a = new Aservlet();
 *  Class clz = Class.forName("com.zking.Aservlet");
 *  AServlet a = clz.newInstance();
 * tomcat中的web.xml中的servlet为什么处理用户的请求呢?
 *   tomcat开发人员定义好了Httpservlet的servlet方法来处理网络请求
 */

2 动态调用方法

Method m;
m.invoke

/**
 * 动态方法调用
 * @author tt
 */
 public class Demo4 {
public static void main(String[] args) throws Exception {
 Class clz = Student.class;
 // Method m = clz.getDeclaredMethod("hello");  
 //第一个参数指的是,类类的类实例化的类实例
// 第二个参数:指的是调用方法所携带的可变参数
// Method类invoke方法的返回值就是被调用的方法的返回值
// 如果被调用的方法的不具备返回值,那么返回null,
// System.out.println(m.invoke(clz.newInstance()));
Method m = clz.getDeclaredMethod("add",Integer.class,Integer.class);
 m.setAccessible(true);
 Object invoke = m.invoke(clz.newInstance(),20,4);
 System.out.println(invoke);
 }
}

3 读写属性

Field set/get

/**
 * 反射读写属性
 * @author tt
 */
 public class Demo5 {
 public static void main(String[] args) throws Exception {
  Student stu = new Student("s001","zs");
  stu.age = 23;
  Class clz = stu.getClass();
  //获取属性值
//  Field[] fields = clz.getDeclaredFields();
//  for (Field field : fields) {
//   field.setAccessible(true);
//   System.out.println(field.getName()+" : "+field.get(stu));
//  }
//设置属性值  共有的
//  Field field = clz.getDeclaredField("age");
//  field.set(stu, 45);
//  System.out.println(stu.age);
Field field = clz.getDeclaredField("name");
  field.setAccessible(true);
  field.set(stu, "ls");
  System.out.println(stu.getSname());
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值