JAVA反射简单总结理解

一、JAVA反射的优点:

前言:在开始使用反射的时候,感觉不是很重要,而且有点时候甚至感觉有点影响性能,比如IDE中自动补全代码就是一个反射的过程,所以,每次自动补全代码的时候都感觉卡了一下(还附带一些心理作用)

场景:在一次项目包已经发布的情况下,突然要修改一个数据库连接属性,很麻烦,需要重新改配置文件,打包,发布部署这一系列的过程,.java文件在经过了编译之后会生成.class文件,所以,在项目执行时,执行的是.class文件,而这时之前通过new对象生成的属性是不可更改的了,此时,只能选择执行或 不执行class文件。

优点:所以此时,反射的作用很大,只需用Class.forname()的方法加载驱动,修改配置文件信息即可。

Tips:

多说以下Class.forName和ClassLoader的区别:
Class.forName:将编译后的.class文件加载到jvm中,并通过设置initialize值(默认为true)选择是否进行初始化

ClassLoader:将.class文件加载到jvm中后,不会立即进行初始化,只有在newInstance才会执行static块(即初始化)

================================分割线==================================

下面整理一下关于反射的代码:

1,获取class类有三种方法:

//获取class类
//1,
Class<?> clazz1 = Class.forName("test.Student");
//2,
Class<Student> clazz2 = Student.class;
//3,
Student stu = new Student();
Class<? extends Student> clazz3 = stu.getClass();

2,创建实例

Class<?> clazz1 = Class.forName("test.Student");
Student student = (Student) clazz1.newInstance();
  •     创建无参构造和有参构造函数
Class<?> clazz1 = Class.forName("test.Student");
//无参构造函数
Constructor<?> constructor = clazz1.getConstructor();
Student stu1 = (Student) constructor.newInstance();
//有参构造函数
Constructor<?> constructor1 = clazz1.getConstructor(String.class,Integer.class);
Student stu2 = (Student) constructor1.newInstance("name",12);

3,获取成员变量

  • 获取公有成员变量
Class<?> clazz1 = Class.forName("test.Student");
Field name = clazz1.getField("name");
name.set(student, "QALink");
System.out.println("公有成员变量:"+name);
  • 获取私有成员变量
//获取私有成员变量
Field age = clazz1.getDeclaredField("age");
//去除私有权限
age.setAccessible(true);
age.set(student, 20);
System.out.println("私有成员变量:"+age);

4,获取成员方法

   (1)获取公有成员方法:

  • 获取无参公有成员方法:
Class<?> clazz1 = Class.forName("test.Student");
Constructor<?> constructor1 = clazz1.getConstructor(String.class,Integer.class);
Student stu2 = (Student) constructor1.newInstance("name",12);
//获取无参私有成员方法
Method isA = clazz1.getMethod("isA");
isA.invoke(stu2);
  • 获取有参公有成员方法:
Class<?> clazz1 = Class.forName("test.Student");
Constructor<?> constructor1 = clazz1.getConstructor(String.class,Integer.class);
Student stu2 = (Student) constructor1.newInstance("name",12);
//获取有参私有成员方法
Method isA1 = clazz1.getMethod("isA", String.class);
isA1.invoke(stu2, "QALink");

  (2)获取私有成员方法:

  • 获取无参私有成员方法:
Class<?> clazz1 = Class.forName("test.Student");
Constructor<?> constructor1 = clazz1.getConstructor(String.class,Integer.class);
Student stu2 = (Student) constructor1.newInstance("name",12);
//获取无参私有成员方法
Method iAm = clazz1.getDeclaredMethod("iAm");
iAm.setAccessible(true);
iAm.invoke(stu2);
  • 获取有参私有成员方法:
Class<?> clazz1 = Class.forName("test.Student");
Constructor<?> constructor1 = clazz1.getConstructor(String.class,Integer.class);
Student stu2 = (Student) constructor1.newInstance("name",12);
//获取有参私有成员方法
Method iAm1 = clazz1.getDeclaredMethod("iAm", String.class);
iAm1.setAccessible(true);
iAm1.invoke(stu2, "QALink");

最后打印的结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值