Java知识点总结(反射-通过反射操作类的属性和方法 )

Java知识点总结(反射-通过反射操作类的属性和方法 )

@(Java知识点总结)[Java, 反射]

使用反射操作类的属性和方法:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class Test03 {
 
  // 通过反射API调用构造方法,构造对象
  public static void getInstance(Class clazz){
 
   Student student;
   try {
     student = (Student) clazz.newInstance();  // 其实调用无参构造器
     student.setName("张三");
     System.out.println(student.getName());
   } catch (InstantiationException | IllegalAccessException e) {
     e.printStackTrace();
   }
   
   try {
     Constructor c = clazz.getDeclaredConstructor(int.class, String.class);// 调用有参构造器
     Student student2 = (Student) c.newInstance(1, "李四");
     System.out.println(student2.getName());
   } catch (NoSuchMethodException | SecurityException | InstantiationException |
      IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
     e.printStackTrace();
   }
 
  }
 
  // 通过反射API调用普通方法
  public static void method(Class clazz)  {
   try {
     Student student = (Student) clazz.newInstance();
     // 获取方法
     Method method = clazz.getDeclaredMethod("setName", String.class);
     // 激活方法
     method.invoke(student, "王武");  // student.setName("王武");
     System.out.println(student.getName());
   } catch (InstantiationException | IllegalAccessException
      | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
     e.printStackTrace();
   }
  }
 
  //通过反射API操作属性
  public static void field(Class clazz){
   try {
     Student student = (Student) clazz.newInstance();
     Field f1 = clazz.getDeclaredField("name");
     
     // name 是private属性,如果不写会:IllegalAccessException
     f1.setAccessible(true); // 这个私有属性不用做安全检查了,可以直接访问
     f1.set(student, "赵六");
     
     Field f2 = clazz.getDeclaredField("sex"); // sex 是public 属性,不用忽略安全检查
     f2.set(student, "男");
     
     for (Field f : clazz.getDeclaredFields()) {
      f.setAccessible(true);
      System.out.println(f.get(student)); //注意参数是对象名,而不是属性名
     }
     
   } catch (NoSuchFieldException | SecurityException |
      IllegalArgumentException | IllegalAccessException | InstantiationException e) {
     e.printStackTrace();
   }
  }
  public static void main(String[] args) {
   String path = "com.gs.Student";
   try {
     Class clazz = Class.forName(path);
     //getInstance(clazz);
     //method(clazz);
     field(clazz);
   } catch (Exception e) {
     e.printStackTrace();
   }
 
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值