AI智能
改变未来

java进阶(41)–反射机制

文档目录:

一、反射机制的作用

二、反射机制相关类

三、获取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
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » java进阶(41)–反射机制