文档目录:
一、反射机制的作用
二、反射机制相关类
三、获取class的三种方式
四、通过反射实例化对象
五、通过读属性文件实例化对象
六、通过反射机制访问对象属性
七、通过反射机制调用方法
—————————————分割线:正文——————————————————–
一、反射机制的作用
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;23 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.Stringclass java.util.56cDateclass java.lang.Integer
2、getClass()
1 package com.bk.java.Test41.reflect01;23 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;23 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.Test420801.reflect01;23 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;23 import java.io.FileNotFoundException;4 import java.io.FileReader;5 import java.io.IOException;6 import java.util.Properties;78 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获取value18 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.DateMon Apr 05 17:21:25 CST 2021
2、以流的形式直接返回
1 package com.bk.java.Test41.reflect01;23 import java.io.FileNotFoundException;4 import java.io.FileReader;5 import java.io.IOException;6 import java.util.Properties;78 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获取value16 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获取valueString 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;23 public class Student {4 public int no;5 private String name;6 protected int age;7 boolean sex;89 public Student() {10 }1112 public int getNo() {13 return no;14 }1516 public void setNo(int no) {17 this.no = no;18 }1920 public String getName() {21 return name;22 }2324 public void setName(String name) {25 this.name = name;26 }2728 public int getAge() {29 return age;30 }3132 public void setAge(int age) {33 this.age = age;34 }3536 public boolean isSex() {37 return sex;38 }3940 public void setSex(boolean sex) {41 this.sex = sex;42 }43 }
通过反射机制访问对象属性
1 package com.bk.java.Test41.reflect02;23 import java.lang.reflect.Field;45 public class ReflectTest01 {2fb26 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属性通过属性name10 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;23 import java.lang.reflect.InvocationTargetException;4 import java.lang.reflect.Method;56 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 //获取Method16 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