java进阶(41)--反射机制
文档目录:
---------------------------------------分割线:正文--------------------------------------------------------
一、反射机制的作用
1、通过java语言中反射机制可以操作字节码文件
2、通过反射机制可以操作代码片段(class文件)
二、反射机制相关类
1、对应的包:java.lang.reflect.*
2、有哪些重要的类:
java.lang.class --> 代表整个字节码文件,代码一个类型,代码整个类
java.lang.reflect.Method --> 代表字节码中的方法字节码,代码类中构造方法
java.lang.reflect.Constructor --> 代表字节码中构造方法字节码,代表类中构造方法
java.lang.reflect.Field -->代表类中属性
三、获取class的三种方式
1、forName()
1 package com.bk.java.Test41.reflect01;
2
3 public class ReflectTest01 {
4 public static void main(String[] args) throws ClassNotFoundException {
5 Class c1=Class.forName("java.lang.String");
6 Class c2=Class.forName("java.util.Date");
7 Class c3=Class.forName("java.lang.Integer");
8 System.out.println(c1);
9 System.out.println(c2);
10 System.out.println(c3);
11 }
12 }
查看执行结果:
class java.lang.String
class java.util.Date
class java.lang.Integer
2、getClass()
1 package com.bk.java.Test41.reflect01;
2
3 public class ReflectTest02 {
4 public static void main(String[] args) throws ClassNotFoundException {
5 String s="abc";
6 Class c1=Class.forName("java.lang.String");
7 Class x=s.getClass();
8 //内存地址一致,都指向方法区中的字节码
9 System.out.println(x==c1);
10 }
11 }
执行结果为true
3、.class属性
1 package com.bk.java.Test41.reflect01;
2
3 public class ReflectTest03 {
4 public static void main(String[] args) {
5 String s="123";
6 Class y=s.getClass();
7 Class z=String.class;
8 System.out.println(y==z);
9 }
10 }
执行结果为true
四、通过反射实例化对象
1 package com.bk.java.Test41.reflect01;
2
3 public class ReflectTest04 {
4 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
5 Class c=Class.forName("com.bk.java.Test41.reflect01.User");
6 //必须保证User类包含无参构造的方法,调用User类的无参构造方法,完成实例对象的创建
7 Object obj= c.newInstance();
8 System.out.println(obj);
9 }
10 }
查看运行结果
调用了User类的无参构造方法
com.bk.java.Test41.reflect01.User@1b6d3586
五、通过读属性文件实例化对象
1、通过i/o流读取classinfo.properties
配置文件:
classinfo.properties:
className=com.bk.java.Test41.reflect01.User
1 package com.bk.java.Test41.reflect01;
2
3 import java.io.FileNotFoundException;
4 import java.io.FileReader;
5 import java.io.IOException;
6 import java.util.Properties;
7
8 public class ReflectTest05 {
9 public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
10 //通过I/O流读取classinfo.properties文件
11 FileReader reader=new FileReader("src/com/bk/java/Test41/reflect01/classinfo.properties");
12 //创建属性类对象
13 Properties pro=new Properties();
14 pro.load(reader);
15 //关闭流
16 reader.close();
17 //通过key获取value
18 String className=pro.getProperty("className");
19 System.out.println(className);
20 //通过反射机制实例化对象
21 Class c=Class.forName(className);
22 Object obj=c.newInstance();
23 System.out.println(obj);
24 }
25 }
查看执行结果:
com.bk.java.Test41.reflect01.User
调用了User类的无参构造方法
com.bk.java.Test41.reflect01.User@1b6d3586
修改配置文件后再次调用查看结果
className=java.util.Date
java.util.Date
Mon Apr 05 17:21:25 CST 2021
2、以流的形式直接返回
1 package com.bk.java.Test41.reflect01;
2
3 import java.io.FileNotFoundException;
4 import java.io.FileReader;
5 import java.io.IOException;
6 import java.util.Properties;
7
8 public class ReflectTest06 {
9 public static void main(String[] args) throws IOException {
10 String path=Thread.currentThread().getContextClassLoader().getResource("com/bk/java/Test41/reflect01/classinfo.properties").getPath();
11 FileReader reader=new FileReader(path);
12 Properties pro=new Properties();
13 pro.load(reader);
14 reader.close();
15 //通过key获取value
16 String className=pro.getProperty("className");
17 System.out.println(className);
18 }
19 }
查看返回结果:返回结果同上
java.util.Date
改进代码如下:
package com.bk.java.Test41.reflect01;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class ReflectTest07 {
public static void main(String[] args) throws IOException {
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/bk/java/Test41/reflect01/classinfo.properties");
Properties pro=new Properties();
pro.load(in);
in.close();
//通过key获取value
String className=pro.getProperty("className");
System.out.println(className);
}
}
3、使用资源绑定器:
package com.bk.java.Test41.reflect01;
import java.util.ResourceBundle;
public class ResourceBundleTest {
    public static void main(String[] args) {
        ResourceBundle bundle=ResourceBundle.getBundle("com/bk/java/Test41/reflect01/classinfo");
        String className=bundle.getString("className");
        System.out.println(className);
    }
}
查看运行结果:
java.util.Date
六、通过反射机制访问对象属性
创建一个Student类
1 package com.bk.java.Test41.reflect02;
2
3 public class Student {
4 public int no;
5 private String name;
6 protected int age;
7 boolean sex;
8
9 public Student() {
10 }
11
12 public int getNo() {
13 return no;
14 }
15
16 public void setNo(int no) {
17 this.no = no;
18 }
19
20 public String getName() {
21 return name;
22 }
23
24 public void setName(String name) {
25 this.name = name;
26 }
27
28 public int getAge() {
29 return age;
30 }
31
32 public void setAge(int age) {
33 this.age = age;
34 }
35
36 public boolean isSex() {
37 return sex;
38 }
39
40 public void setSex(boolean sex) {
41 this.sex = sex;
42 }
43 }
通过反射机制访问对象属性
1 package com.bk.java.Test41.reflect02;
2
3 import java.lang.reflect.Field;
4
5 public class ReflectTest01 {
6 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
7 Class studentClass=Class.forName("com.bk.java.Test41.reflect02.Student");
8 Object obj=studentClass.newInstance();
9 //获取no属性通过属性name
10 Field noField=studentClass.getDeclaredField("no");
11 //给obj对象的no属性赋值
12 noField.set(obj,11111);
13 //读取属性的值
14 System.out.println(noField.get(obj));
15 }
16 }
查看输出结果
11111
七、通过反射机制调用方法
原始方法:
package com.bk.java.Test41.reflect03;
public class ReflectTest {
    public static void main(String[] args) {
        //原始方法调用UserSevice.login方法
        UserService userService=new UserService();
        boolean loginSuccess=userService.login("admin","123");
        System.out.println(loginSuccess?"登录成功":"登录失败");
    }
}
通过反射机制调用:
1 package com.bk.java.Test41.reflect03;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5
6 public class ReflectTest {
7 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
8 // //原始方法调用UserSevice.login方法
9 // UserService userService=new UserService();
10 // boolean loginSuccess=userService.login("admin","123");
11 // System.out.println(loginSuccess?"登录成功":"登录失败");
12 Class userServiceClass =Class.forName("com.bk.java.Test41.reflect03.UserService");
13 //创建实例对象
14 Object obj=userServiceClass.newInstance();
15 //获取Method
16 Method loginMethod=userServiceClass.getDeclaredMethod("login", String.class, String.class);
17 //调用方法
18 Object retvalue=loginMethod.invoke(obj,"admin","123");
19 System.out.println(retvalue);
20 }
21 }
查看运行结果:
true
java进阶(41)--反射机制的更多相关文章
- java中的反射机制在Android开发中的用处
		JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ... 
- 黑马程序员——【Java高新技术】——反射机制
		---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ... 
- Java 中的反射机制
		JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ... 
- JAVA类型信息——反射机制
		JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ... 
- 浅说Java中的反射机制(二)
		写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ... 
- 浅说Java中的反射机制(一)
		在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ... 
- java学习之反射机制
		java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ... 
- java基础之反射机制
		一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ... 
- 深入理解Java中的反射机制
		JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ... 
随机推荐
- GPU 加速 & WebGL
			GPU 加速 & WebGL 开启 GPU 加速, 硬件加速 垃圾面试官,瞎忽悠 holy shit 美国想象力英语,前端 leader WebGL 加速 ??? 是什么鬼 ??? three ... 
- how to write an ebook that can support published by format PDF, Epub, Mobi and so on
			how to write an ebook that can support published by format PDF, Epub, Mobi and so on 如何写一本自己的电子书,支持各 ... 
- how to disabled prefers-color-scheme in js & dark theme
			how to disabled prefers-color-scheme in js dark theme https://developer.mozilla.org/en-US/docs/Web/C ... 
- css & clip-path
			css & clip-path https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path https://tongqu.me/ tw ... 
- js & for & for of & for in & forEach, break
			js & for & for of & for in & forEach, break js for break https://stackoverflow.com/q ... 
- react 遍历 object
			@observable obj = { name: "ajanuw", age: 22, }; @computed get list() { return _.toPairs(th ... 
- NGK.IO超级节点是我们掌握的下一个财富密码吗?
			从日前NGK.IO发布的新闻中,我们捕捉到了一个非常重要的信息,那就是反复被提到的"超级节点".很多人都对这个"超级节点"一头雾水,这个"超级节点&q ... 
- SpringBoot整合MyBatis-Plus框架(代码生成器)
			MyBatis-Plus的简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 代码生成器 通用的CU ... 
- vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap
			目录 一.vue的ajax插件:axios 1.安装axios 2.axios参数 二.CORS跨域问题(同源策略) 1.Django解决CORS跨域问题方法 三.前端请求携带参数及Django后台如 ... 
- 使用syncthing和蒲公英异地组网零成本实现多设备实时同步
			设想一个场景,如果两台电脑之间可以共享一个文件夹,其中一个增删更改其中的内容时,另一个也能同步更新,而且速度不能太慢,最好是免费的.那么syncthing就可以满足这个要求.syncthing可以实现 ... 
